Tak, możesz, ale sposób, w jaki to zrobisz, zależy od Twojej wersji.
Przede wszystkim wyzwalacze same w sobie są transakcyjne; w Twojej sytuacji masz wyzwalacz wstawiania, który wykonuje dwa kolejne wstawienia. Jeśli jedno z nich zawiedzie, uzyskasz pożądany efekt.
Rozważ następujący przykład:
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 ;
Teraz, gdy uruchamiam wstawkę, która kończy się niepowodzeniem, dzieje się tak:
mysql> INSERT INTO a VALUES (5);
ERROR 1054 (42S22): Unknown column 'banana' in 'field list'
mysql> SELECT * FROM a;
Empty set (0.00 sec)
To pasuje do pożądanego wyniku.
Mówiąc bardziej ogólnie, jeśli masz logikę, której możesz użyć do sprawdzenia poprawności danych przed próbą wstawienia, możesz zawieść wyzwalacz na różne sposoby:
- W MySQL 5.5 możesz użyć SIGNAL mechanizm podnoszący błąd z wyzwalacza, powodując w ten sposób niepowodzenie całej wstawki.
- Przed MySQL 5.5 można wygenerować celowy błąd, aby nie zadziałać wyzwalacz.
Zgaduję, że używasz 5.0 z linku w swoim pytaniu, więc jeśli zajdzie taka potrzeba, możesz popełnić umyślny błąd, na przykład celowo wstawić do nieprawidłowej kolumny, aby nie zadziałał wyzwalacz. Jednak sytuacja, którą opisujesz w swoim pytaniu, jest już obsługiwana transakcyjnie, jak opisano na początku mojej odpowiedzi.