sql >> Database teknologi >  >> RDS >> Mysql

MySQL Trigger - Lagring af en SELECT i en variabel

Du kan erklære lokale variabler i MySQL-triggere med DECLARE syntaks.

Her er et eksempel:

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 tildeler en værdi til en variabel, skal du sikre dig, at forespørgslen kun returnerer en enkelt værdi, ikke et sæt rækker eller et sæt kolonner. For eksempel, hvis din forespørgsel returnerer en enkelt værdi i praksis, er det okay, men så snart den returnerer mere end én række, får du "ERROR 1242: Subquery returns more than 1 row ".

Du kan bruge LIMIT eller MAX() for at sikre, at den lokale variabel er sat til en enkelt værdi.

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. Reparer alle borde på én gang

  2. SQL INSERT fra SELECT

  3. Læs en kolonne fra en række fra en MySQL-database

  4. Sådan finder du alle forbundne undergrafer i en urettet graf