Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

MySQL Trigger - Lưu trữ một SELECT trong một biến

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để tôi có thể tối ưu hóa hơn nữa truy vấn bảng dẫn xuất hoạt động tốt hơn truy vấn tương đương với JOINed?

  2. MySQL LIMIT trong một truy vấn con tương ứng

  3. Quyền truy cập root MySQL từ tất cả các máy chủ

  4. PHP và MySQL:Số hàng được trả về

  5. Người dùng không thể truy cập cơ sở dữ liệu