Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySQL Trigger - Stockage d'un SELECT dans une variable

Vous pouvez déclarer des variables locales dans les déclencheurs MySQL, avec le DECLARE syntaxe.

Voici un exemple :

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

Lorsque vous affectez une valeur à une variable, vous devez vous assurer que la requête ne renvoie qu'une seule valeur, et non un ensemble de lignes ou un ensemble de colonnes. Par exemple, si votre requête renvoie une seule valeur en pratique, ça va mais dès qu'elle renvoie plus d'une ligne, vous obtenez "ERROR 1242: Subquery returns more than 1 row ".

Vous pouvez utiliser LIMIT ou MAX() pour vous assurer que la variable locale est définie sur une seule valeur.

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//