sql >> Databáze >  >> RDS >> Mysql

MySQL Trigger - Uložení SELECT do proměnné

Lokální proměnné můžete deklarovat v MySQL triggerech pomocí DECLARE syntaxe.

Zde je příklad:

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

Když přiřadíte hodnotu proměnné, musíte zajistit, aby dotaz vrátil pouze jednu hodnotu, nikoli sadu řádků nebo sadu sloupců. Pokud například váš dotaz v praxi vrátí jednu hodnotu, je to v pořádku, ale jakmile vrátí více než jeden řádek, zobrazí se „ERROR 1242: Subquery returns more than 1 row ".

."

Můžete použít LIMIT nebo MAX() abyste se ujistili, že místní proměnná je nastavena na jednu hodnotu.

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. Oracle ORA-12154:TNS:Nelze vyřešit název služby Chyba?

  2. Funkce JSON_TABLE() v Oracle

  3. Asynchronní replikace Automatické převzetí služeb při selhání v MySQL 8.0.22

  4. Funkce CHARTOROWID() v Oracle