Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Bisakah saya menggunakan kemampuan seperti transaksi di pemicu MySQL?

Ya, Anda bisa, tetapi cara melakukannya bergantung pada versi Anda.

Pertama-tama, pemicu itu sendiri bersifat transaksional; dalam situasi Anda, Anda memiliki pemicu penyisipan yang melakukan dua penyisipan lebih lanjut. Jika salah satu gagal, Anda akan mendapatkan efek yang diinginkan.

Perhatikan contoh berikut:

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 ;

Sekarang, ketika saya menjalankan sisipan yang gagal, ini terjadi:

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

Ini cocok dengan hasil yang Anda inginkan.

Secara umum, jika Anda memiliki logika yang dapat Anda gunakan untuk memvalidasi data Anda sebelum mencoba memasukkan, Anda dapat menggagalkan pemicu dengan cara yang berbeda:

  • Di MySQL 5.5, Anda dapat menggunakan SIGNAL mekanisme untuk memunculkan kesalahan dari pemicu Anda, sehingga menyebabkan kegagalan seluruh penyisipan.
  • Sebelum MySQL 5.5, Anda dapat membuat kesalahan yang disengaja untuk menggagalkan pemicu.

Saya kira Anda menggunakan 5.0 dari tautan dalam pertanyaan Anda, jadi jika perlu, Anda dapat melakukan kesalahan yang disengaja, misalnya dengan sengaja memasukkan ke dalam kolom yang tidak valid, untuk gagal memicu. Namun, situasi yang Anda jelaskan dalam pertanyaan Anda sudah ditangani secara transaksional, seperti yang dijelaskan di awal jawaban saya.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara menghasilkan seluruh skrip database di MySQL Workbench?

  2. Permintaan tunggal Mysql bergabung dengan 3 tabel dan dapatkan semua hasilnya

  3. MySQL:Apa yang terjadi pada bidang non-agregat pada GROUP BY?

  4. MySQL memicu sintaks 'perbarui pada kolom'

  5. mySQL dateTime range Masalah Kueri