sql >> Databasteknik >  >> RDS >> Mysql

MySQL Trigger - Lagra en SELECT i en variabel

Du kan deklarera lokala variabler i MySQL-utlösare, med DECLARE syntax.

Här är ett exempel:

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

När du tilldelar ett värde till en variabel måste du se till att frågan endast returnerar ett enda värde, inte en uppsättning rader eller en uppsättning kolumner. Till exempel, om din fråga returnerar ett enstaka värde i praktiken är det okej, men så snart den returnerar mer än en rad får du "ERROR 1242: Subquery returns more than 1 row ".

Du kan använda LIMIT eller MAX() för att se till att den lokala variabeln är inställd på ett enda värde.

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. Referensalias (beräknat i SELECT) i WHERE-satsen

  2. DB design:medlemmar tabell separat eller alla i en tabell?

  3. Hibernate kodar fel medan kvarstående objekt [UTF-8]

  4. Partitionering av en databastabell i MySQL