Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MySQL Trigger - Armazenando um SELECT em uma variável


Você pode declarar variáveis ​​locais em triggers do MySQL, com o comando DECLARE sintaxe.

Aqui está um exemplo:
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

Ao atribuir um valor a uma variável, você deve garantir que a consulta retorne apenas um único valor, não um conjunto de linhas ou um conjunto de colunas. Por exemplo, se sua consulta retornar um único valor na prática, tudo bem, mas assim que retornar mais de uma linha, você obterá "ERROR 1242: Subquery returns more than 1 row ".

Você pode usar LIMIT ou MAX() para certificar-se de que a variável local está configurada para um único valor.
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//