sql >> Databáze >  >> RDS >> Mysql

Mohu ve spouštěči MySQL použít schopnost podobnou transakcím

Ano, můžete, ale jak to uděláte, závisí na vaší verzi.

Za prvé, spouštěče jsou samy o sobě transakční; ve vaší situaci máte spouštěč vložení, který provede dvě další vložení. Pokud jeden z nich selže, dosáhnete požadovaného efektu.

Zvažte následující příklad:

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 ;

Nyní, když spustím vložku, která selže, stane se toto:

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 odpovídá požadovanému výsledku.

Obecněji řečeno, pokud máte logiku, kterou můžete použít k ověření dat před pokusem o vložení, můžete selhat spouštění různými způsoby:

  • V MySQL 5.5 můžete použít SIGNAL mechanismus, který vyvolá chybu z vašeho spouštěče, což způsobí, že selže celá vložka.
  • Před verzí MySQL 5.5 můžete vygenerovat záměrnou chybu, aby selhal spouštěč.

Hádám, že používáte 5.0 z odkazu ve vaší otázce, takže pokud potřebujete, můžete provést záměrnou chybu, například záměrně vložit do neplatného sloupce, abyste selhali při spuštění. Nicméně situace, kterou popisujete ve své otázce, je již řešena transakčně, jak je popsáno na začátku mé odpovědi.



  1. PostgreSQL:platný vzorek přiřazení proměnné?

  2. Jak se můžeme lišit LEFT OUTER JOIN a Left Join

  3. Jak získat jméno supervizora místo UserID + INNER JOIN v MYSQL

  4. Jak napsat dotaz šablony hibernace z dotazu SQL?