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

Posso usare la capacità di transazione come nel trigger di MySQL

Sì, puoi, ma il modo in cui lo fai dipende dalla tua versione.

Prima di tutto, i trigger sono essi stessi transazionali; nella tua situazione, hai un trigger di inserimento che esegue altri due inserimenti. Se uno di questi fallisce, otterrai l'effetto desiderato.

Considera il seguente esempio:

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 ;

Ora, quando eseguo un inserimento che non riesce, accade questo:

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

Questo corrisponde al risultato desiderato.

Più in generale, se hai una logica che puoi utilizzare per convalidare i tuoi dati prima di tentare l'inserimento, puoi fallire il trigger in diversi modi:

  • In MySQL 5.5, puoi utilizzare il SEGNALE meccanismo per generare un errore dal trigger, causando così il fallimento dell'intero inserto.
  • Prima di MySQL 5.5, puoi generare un errore intenzionale per non riuscire il trigger.

Immagino che tu stia usando 5.0 dal link nella tua domanda, quindi se necessario, puoi eseguire un errore deliberato, ad esempio inserire deliberatamente in una colonna non valida, per fallire un trigger. Tuttavia, la situazione che descrivi nella tua domanda è già gestita a livello transazionale, come descritto all'inizio della mia risposta.