Fuente: http://dev.mysql.com/doc/refman/5.0/es/variables.html
MySQL 5.0 soporta variables de usuario, las cuales permiten almacenar un valor y hacer referencia a él más tarde; esto posibilita pasar valores de una sentencia a otra. Las variables de usuario son específicas de la conexión. Esto significa que una variable definida por un cliente no puede ser vista o utilizada por otros clientes. Todas las variables de un cliente son automáticamente liberadas cuando ese cliente abandona la conexión.
Las variables de usuario se escriben como @nombre_var
, donde el nombre de variable nombre_var
puede consistir de caracteres alfanuméricos tomados del conjunto de caracteres actual, .
, _
, y $
. El conjunto de caracteres predeterminado es ISO-8859-1
(Latin1).
Esto puede cambiarse con la opción de mysqld --default-character-set
. Consulte Sección 5.9.1, “El conjunto de caracteres utilizado para datos y ordenación”. Los nombres de variables de usuario no son sensibles a mayúsculas en MySQL 5.0.
Una forma de establecer una variable de usuario es empleando una sentencia SET:
1 SET @nombre_var = expr [, @nombre_var = expr] ...
Con SET
, tanto =
como :=
pueden usarse como operadores de asignación.
La expr
asignada a cada variable puede evaluarse a un valor entero, real, cadena, o NULL
.
Una variable de usuario también puede recibir valores en otras sentencias que no sean SET. En este caso, el operador de asignación debe ser := y no = porque = se considera operador de comparación en otras sentencias que no sean SET:
1 SET @t1=0, @t2=0, @t3=0;
2 SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;
3 +----------------------+------+------+------+
4 | @t1:=(@t2:=1)+@t3:=4 | @t1 | @t2 | @t3 |
5 +----------------------+------+------+------+
6 | 5 | 5 | 1 | 4 |
7 +----------------------+------+------+------+
Nota: en una sentencia SELECT
, cada expresión se evalúa solamente cuando se envía al cliente. Esto significa que en una cláusula HAVING
, GROUP BY
, u ORDER BY
, no es posible hacer referencia a una expresión que comprenda variables que reciben su valor en la lista del SELECT
.Por ejemplo, la siguiente sentencia no funcionará como se espera:
SELECT (@aa:=id) AS a, (@aa+3) AS b FROM tbl_name HAVING b=5;
La referencia a b en la cláusula HAVING hace referencia al alias de una expresión de la lista SELECT que hace uso de la variable @aa. Esto no funciona como se esperaría: @aa no contiene el valor de la fila actual, sino el valor del id de la fila anteriormente seleccionada.
La regla general es que nunca se asigne un valor a una variable de usuario en una parte de una sentencia y se use la misma variable en otra parte de la misma sentencia. Se podrían obtener los resultados esperados, pero esto no está garantizado.
1 DROP TABLE IF EXISTS jugadores;
2 CREATE TABLE IF NOT EXISTS jugadores(
3 id INT(5) NOT NULL AUTO_INCREMENT,
4 pais_id INT (3) NOT NULL,
5 nombre VARCHAR(150),
6 num_camiseta INT (3),
7 PRIMARY KEY (id)
8 ) ENGINE = INNODB;
9
10 SET @pais_id = (SELECT id FROM paises WHERE nombre = 'Suiza');
11
12 INSERT INTO `jugadores` (`id`, `pais_id`, `nombre`, `num_camiseta`) VALUES
13 (null, @pais_id, 'Diego Benaglio', 1),
14 (null, @pais_id, 'Stephan Lichtsteiner',2);
esquema mundial: bd_mundial
Archivo fuente: ejemplo-insert.jugadores
Paises: paises
Variables en mysql | 1 |
---|---|
Variables en mysql | 2 |
- | 3 |
- | 4 |
Ejemplo: | 5 |
Table of Contents | t |
---|---|
Exposé | ESC |
Full screen slides | e |
Presenter View | p |
Source Files | s |
Slide Numbers | n |
Toggle screen blanking | b |
Show/hide slide context | c |
Notes | 2 |
Help | h |