Mysql
 sql >> база данни >  >> RDS >> Mysql

MySQL Trigger - Съхранение на SELECT в променлива

Можете да декларирате локални променливи в MySQL тригери с DECLARE синтаксис.

Ето един пример:

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

Когато присвоите стойност на променлива, трябва да се уверите, че заявката връща само една стойност, а не набор от редове или набор от колони. Например, ако вашата заявка връща една стойност на практика, всичко е наред, но веднага щом върне повече от един ред, получавате „ERROR 1242: Subquery returns more than 1 row ".

Можете да използвате LIMIT или MAX() за да се уверите, че локалната променлива е настроена на една стойност.

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. Грешка при добавяне на външен ключ

  2. MySQL в облака – онлайн миграция от Amazon RDS към EC2 екземпляр:Част първа

  3. INSERT INTO се проваля с node-mysql

  4. Как да намеря следващия запис след определен в SQL?

  5. SQL заявка за избор с помощта на функции за присъединяване, групиране по и агрегатиране