sql >> Database >  >> RDS >> Mysql

Kan ik transactie-achtige mogelijkheden gebruiken in MySQL-trigger?

Ja dat kan, maar hoe je het doet hangt af van je versie.

Allereerst zijn triggers zelf transactioneel; in jouw situatie heb je een insert-trigger die nog twee inserts uitvoert. Als een van deze faalt, krijgt u het gewenste effect.

Beschouw het volgende voorbeeld:

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 ;

Als ik nu een invoegtoepassing uitvoer die mislukt, gebeurt dit:

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

Dit komt overeen met het gewenste resultaat.

Meer in het algemeen, als je logica hebt die je kunt gebruiken om je gegevens te valideren voordat je het invoegt, kun je de trigger op verschillende manieren mislukken:

  • In MySQL 5.5 kun je de SIGNAL mechanisme om een ​​fout van je trigger op te heffen, waardoor de hele invoeging mislukt.
  • Vóór MySQL 5.5 kunt u een opzettelijke fout genereren om de trigger te laten mislukken.

Ik vermoed dat je 5.0 uit de link in je vraag gebruikt, dus als dat nodig is, kun je een opzettelijke fout uitvoeren, bijvoorbeeld opzettelijk invoegen in een ongeldige kolom, om een ​​trigger te laten mislukken. De situatie die u in uw vraag beschrijft, wordt echter al transactioneel afgehandeld, zoals beschreven aan het begin van mijn antwoord.



  1. Beestje? #1146 - Tabel 'xxx.xxxxx' bestaat niet

  2. MySQL SUM met dezelfde ID

  3. Twee rijen samenvoegen tot één terwijl u null-waarden vervangt

  4. PDO-equivalent van mysql_num_rows of mssql_num_rows