Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Tôi có thể sử dụng khả năng giao dịch giống như trong trình kích hoạt MySQL không

Có, bạn có thể, nhưng cách bạn làm điều đó phụ thuộc vào phiên bản của bạn.

Trước hết, bản thân các trình kích hoạt là giao dịch; trong tình huống của bạn, bạn có một trình kích hoạt chèn thực hiện thêm hai lần chèn nữa. Nếu một trong những không thành công, bạn sẽ có được hiệu quả mong muốn.

Hãy xem xét ví dụ sau:

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 ;

Bây giờ, khi tôi chạy một chèn không thành công, điều này xảy ra:

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

Điều này phù hợp với kết quả mong muốn của bạn.

Nói chung hơn, nếu bạn có logic mà bạn có thể sử dụng để xác thực dữ liệu của mình trước khi thử chèn, bạn có thể không kích hoạt được theo những cách khác nhau:

  • Trong MySQL 5.5, bạn có thể sử dụng SIGNAL cơ chế tạo ra lỗi từ trình kích hoạt của bạn, do đó khiến nó không thực hiện được toàn bộ quá trình chèn.
  • Trước MySQL 5.5, bạn có thể tạo ra một lỗi cố ý làm hỏng trình kích hoạt.

Tôi đoán bạn đang sử dụng 5.0 từ liên kết trong câu hỏi của mình, vì vậy nếu cần, bạn có thể thực hiện một lỗi cố ý, ví dụ:cố ý chèn vào một cột không hợp lệ, để không kích hoạt được. Tuy nhiên, tình huống bạn mô tả trong câu hỏi của mình đã được xử lý theo phương thức giao dịch, như được mô tả ở đầu câu trả lời của tôi.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. cài đặt cả mysql và mysqlnd trên ubuntu 12.04

  2. Mysql Where ... In ... AND where ... in ... chỉ nên khớp trên cùng một chỉ mục

  3. Cách chọn động tên cột trong mySQL

  4. Mysql Thủ tục được lưu trữ với Mảng chuỗi java

  5. mysql_real_escape_string () loại bỏ hoàn toàn chuỗi