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

Kan jeg bruge transaktionslignende kapacitet i MySQL trigger

Ja det kan du, men hvordan du gør det afhænger af din version.

Først og fremmest er triggere i sig selv transaktionelle; i din situation har du en indsatsudløser, der udfører yderligere to indsættelser. Hvis en af ​​disse fejler, får du den ønskede effekt.

Overvej følgende eksempel:

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 jeg kører en insert, der mislykkes, sker dette:

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

Dette matcher dit ønskede resultat.

Mere generelt, hvis du har logik, du kan bruge til at validere dine data, før du forsøger at indsætte, kan du fejle udløseren på forskellige måder:

  • I MySQL 5.5 kan du bruge SIGNAL mekanisme til at rejse en fejl fra din trigger, hvilket får den til at mislykkes hele indsatsen.
  • Før MySQL 5.5 kan du generere en bevidst fejl for at mislykkes med udløseren.

Jeg gætter på, at du bruger 5.0 fra linket i dit spørgsmål, så hvis du har brug for det, kan du udføre en bevidst fejl, for eksempel bevidst indsætte i en ugyldig kolonne, for at fejle en trigger. Den situation, du beskriver i dit spørgsmål, er dog allerede håndteret transaktionsmæssigt, som beskrevet i starten af ​​mit svar.



  1. Optimerer MySQL underforespørgsler automatisk?

  2. MySQL-forespørgselsfejl 1054

  3. MariaDB SQL Set Operators

  4. MySQL-parametriserede forespørgsler