Lokální proměnné můžete deklarovat v MySQL triggerech pomocí DECLARE
syntaxe.
Zde je příklad:
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
Když přiřadíte hodnotu proměnné, musíte zajistit, aby dotaz vrátil pouze jednu hodnotu, nikoli sadu řádků nebo sadu sloupců. Pokud například váš dotaz v praxi vrátí jednu hodnotu, je to v pořádku, ale jakmile vrátí více než jeden řádek, zobrazí se „ERROR 1242: Subquery returns more than 1 row
".
Můžete použít LIMIT
nebo MAX()
abyste se ujistili, že místní proměnná je nastavena na jednu hodnotu.
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//