Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL Trigger - Memorizzazione di un SELECT in una variabile

Puoi dichiarare variabili locali nei trigger MySQL, con DECLARE sintassi.

Ecco un esempio:

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

Quando si assegna un valore a una variabile, è necessario assicurarsi che la query restituisca un solo valore, non un insieme di righe o un insieme di colonne. Ad esempio, se la tua query restituisce un singolo valore in pratica, va bene, ma non appena restituisce più di una riga, ottieni "ERROR 1242: Subquery returns more than 1 row ".

Puoi usare LIMIT o MAX() per assicurarsi che la variabile locale sia impostata su un unico valore.

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