Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Kann ich transaktionsähnliche Funktionen im MySQL-Trigger verwenden?

Ja, das kannst du, aber wie du es machst, hängt von deiner Version ab.

Zunächst einmal sind Auslöser selbst transaktional; In Ihrer Situation haben Sie einen Insert-Trigger, der zwei weitere Inserts durchführt. Wenn einer davon fehlschlägt, erhalten Sie den gewünschten Effekt.

Betrachten Sie das folgende Beispiel:

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 ;

Wenn ich jetzt eine fehlgeschlagene Einfügung ausführe, passiert Folgendes:

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

Dies entspricht Ihrem gewünschten Ergebnis.

Allgemeiner gesagt, wenn Sie über eine Logik verfügen, die Sie verwenden können, um Ihre Daten zu validieren, bevor Sie die Einfügung versuchen, können Sie den Trigger auf verschiedene Arten fehlschlagen lassen:

  • In MySQL 5.5 können Sie das SIGNAL Mechanismus, um einen Fehler von Ihrem Trigger auszulösen, was dazu führt, dass die gesamte Einfügung fehlschlägt.
  • Vor MySQL 5.5 können Sie einen absichtlichen Fehler generieren, um den Trigger fehlschlagen zu lassen.

Ich vermute, Sie verwenden 5.0 aus dem Link in Ihrer Frage. Wenn Sie also müssen, können Sie einen absichtlichen Fehler ausführen, z. B. absichtlich in eine ungültige Spalte einfügen, um einen Trigger fehlschlagen zu lassen. Die Situation, die Sie in Ihrer Frage beschreiben, wird jedoch bereits transaktional gehandhabt, wie zu Beginn meiner Antwort beschrieben.