Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL-Trigger - Speichern eines SELECT in einer Variablen

Mit DECLARE können Sie lokale Variablen in MySQL-Triggern deklarieren Syntax.

Hier ist ein Beispiel:

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

Wenn Sie einer Variablen einen Wert zuweisen, müssen Sie sicherstellen, dass die Abfrage nur einen einzelnen Wert zurückgibt, nicht eine Gruppe von Zeilen oder eine Gruppe von Spalten. Wenn Ihre Abfrage beispielsweise in der Praxis einen einzelnen Wert zurückgibt, ist dies in Ordnung, aber sobald sie mehr als eine Zeile zurückgibt, erhalten Sie "ERROR 1242: Subquery returns more than 1 row ".

Sie können LIMIT verwenden oder MAX() um sicherzustellen, dass die lokale Variable auf einen einzigen Wert gesetzt ist.

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