sql >> Databasteknik >  >> RDS >> Mysql

Kan jag använda transaktionsliknande kapacitet i MySQL trigger

Ja du kan, men hur du gör det beror på din version.

Först och främst är triggers i sig transaktionella; i din situation har du en insättningsutlösare som utför ytterligare två insättningar. Om en av dessa misslyckas får du önskad effekt.

Tänk på följande exempel:

CREATE TABLE a (colA INT);
CREATE TABLE b (colB INT);
CREATE TABLE c (colC INT);
delimiter :
CREATE TRIGGER testtrig BEFORE INSERT ON a
  FOR EACH ROW BEGIN
    INSERT INTO b(colB) VALUES(NEW.colA);
    INSERT INTO c(banana) VALUES (NEW.colA); -- note the faulty column name
END;:
delimiter ;

Nu, när jag kör en insättning som misslyckas, händer detta:

mysql> INSERT INTO a VALUES (5);
ERROR 1054 (42S22): Unknown column 'banana' in 'field list'
mysql> SELECT * FROM a;
Empty set (0.00 sec)

Detta matchar ditt önskade resultat.

Mer generellt, om du har logik som du kan använda för att validera dina data innan du försöker infoga, kan du misslyckas med utlösaren på olika sätt:

  • I MySQL 5.5 kan du använda SIGNAL mekanism för att ta fram ett fel från din utlösare, vilket gör att den misslyckas med hela infogningen.
  • Före MySQL 5.5 kan du generera ett avsiktligt fel för att misslyckas med utlösaren.

Jag gissar att du använder 5.0 från länken i din fråga, så om du behöver kan du utföra ett avsiktligt fel, till exempel avsiktligt infoga i en ogiltig kolumn, för att misslyckas med en trigger. Situationen du beskriver i din fråga är dock redan hanterad transaktionsmässigt, som beskrivs i början av mitt svar.



  1. Python-databasprogrammering med SQL Express för nybörjare

  2. Hur kan du få de aktiva användarna anslutna till en postgreSQL-databas via SQL?

  3. Vad är omfattningen av 'SET foreign_key_checks =0'?

  4. Hur ändrar jag SQL Server 2005 till att vara skiftlägeskänslig?