sql >> Base de Datos >  >> RDS >> Mysql

MySQL Trigger:almacenar un SELECT en una variable

Puede declarar variables locales en disparadores de MySQL, con DECLARE sintaxis.

He aquí un ejemplo:

DROP TABLE IF EXISTS foo;
CREATE TABLE FOO (
  i SERIAL PRIMARY KEY
);

DELIMITER //
DROP TRIGGER IF EXISTS bar //

CREATE TRIGGER bar AFTER INSERT ON foo
FOR EACH ROW BEGIN
  DECLARE x INT;
  SET x = NEW.i;
  SET @a = x; -- set user variable outside trigger
END//

DELIMITER ;

SET @a = 0;

SELECT @a; -- returns 0

INSERT INTO foo () VALUES ();

SELECT @a; -- returns 1, the value it got during the trigger

Cuando asigna un valor a una variable, debe asegurarse de que la consulta devuelva solo un valor único, no un conjunto de filas o un conjunto de columnas. Por ejemplo, si su consulta devuelve un solo valor en la práctica, está bien, pero tan pronto como devuelva más de una fila, obtendrá "ERROR 1242: Subquery returns more than 1 row ".

Puedes usar LIMIT o MAX() para asegurarse de que la variable local se establece en un solo valor.

CREATE TRIGGER bar AFTER INSERT ON foo
FOR EACH ROW BEGIN
  DECLARE x INT;
  SET x = (SELECT age FROM users WHERE name = 'Bill'); 
  -- ERROR 1242 if more than one row with 'Bill'
END//

CREATE TRIGGER bar AFTER INSERT ON foo
FOR EACH ROW BEGIN
  DECLARE x INT;
  SET x = (SELECT MAX(age) FROM users WHERE name = 'Bill');
  -- OK even when more than one row with 'Bill'
END//