Bạn có thể khai báo các biến cục bộ trong trình kích hoạt MySQL, với DECLARE
cú pháp.
Đây là một ví dụ:
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
Khi bạn gán giá trị cho một biến, bạn phải đảm bảo rằng truy vấn chỉ trả về một giá trị duy nhất, không phải một tập hợp các hàng hoặc một tập hợp các cột. Ví dụ:nếu truy vấn của bạn trả về một giá trị duy nhất trong thực tế thì không sao nhưng ngay sau khi nó trả về nhiều hơn một hàng, bạn sẽ nhận được "ERROR 1242: Subquery returns more than 1 row
".
Bạn có thể sử dụng LIMIT
hoặc MAX()
để đảm bảo rằng biến cục bộ được đặt thành một giá trị duy nhất.
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//