Mysql
 sql >> Base de données >  >> RDS >> Mysql

Puis-je utiliser la capacité de transaction comme dans le déclencheur MySQL

Oui, vous pouvez, mais la façon dont vous procédez dépend de votre version.

Tout d'abord, les déclencheurs sont eux-mêmes transactionnels; dans votre situation, vous avez un déclencheur d'insertion qui effectue deux autres insertions. Si l'un d'entre eux échoue, vous obtiendrez l'effet souhaité.

Prenons l'exemple suivant :

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 ;

Maintenant, lorsque j'exécute une insertion qui échoue, cela se produit :

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

Cela correspond au résultat souhaité.

Plus généralement, si vous disposez d'une logique que vous pouvez utiliser pour valider vos données avant de tenter l'insertion, vous pouvez faire échouer le déclencheur de différentes manières :

  • Dans MySQL 5.5, vous pouvez utiliser le SIGNAL mécanisme pour générer une erreur à partir de votre déclencheur, provoquant ainsi l'échec de toute l'insertion.
  • Avant MySQL 5.5, vous pouvez générer une erreur délibérée pour faire échouer le déclencheur.

Je suppose que vous utilisez 5.0 à partir du lien dans votre question, donc si vous en avez besoin, vous pouvez effectuer une erreur délibérée, par exemple insérer délibérément dans une colonne invalide, pour faire échouer un déclencheur. Cependant, la situation que vous décrivez dans votre question est déjà traitée de manière transactionnelle, comme décrit au début de ma réponse.