Hướng dẫn access new value inside trigger mysql - truy cập giá trị mới bên trong kích hoạt mysql
Làm thế nào tôi có thể truy cập các giá trị của bảng 1 trong một kích hoạt? Show Ví dụ:
Đây là kích hoạt của tôi:
Lưu ý rằng 2 là khóa ngoại cho bảng 3.SQL Server có từ khóa 1, dường như không hoạt động cho MySQL.Answer: 5 Tài liệu tham khảo 6 trên bảng mà bộ kích hoạt được đặt trên, không phải bảng đang được cập nhật.not the table that is being updated. 25.3.1 & NBSP; Cú pháp và ví dụ kích hoạtĐể tạo trình kích hoạt hoặc thả trình kích hoạt, hãy sử dụng câu lệnh 7 hoặc 8, được mô tả trong Phần & NBSP; 13.1.22, Tuyên bố tạo Trigger Statement, và Phần & NBSP; 13.1.34, câu lệnh Trigger Drop.Dưới đây là một ví dụ đơn giản liên kết một kích hoạt với bảng, để kích hoạt cho các hoạt động 9. Trình kích hoạt hoạt động như một bộ tích lũy, tổng hợp các giá trị được chèn vào một trong các cột của bảng.
Câu lệnh 7 tạo ra một kích hoạt có tên 1 được liên kết với bảng 2. Nó cũng bao gồm các điều khoản chỉ định thời gian hành động kích hoạt, sự kiện kích hoạt và phải làm gì khi kích hoạt kích hoạt:
Để sử dụng trình kích hoạt, đặt biến tích lũy thành 0, thực thi câu lệnh 9 và sau đó xem giá trị nào biến có sau đó:
Trong trường hợp này, giá trị của 5 sau tuyên bố 9 đã được thực thi là 7 hoặc 8.Để phá hủy kích hoạt, sử dụng câu lệnh 9. Bạn phải chỉ định tên lược đồ nếu trình kích hoạt không nằm trong lược đồ mặc định:
Nếu bạn thả một bảng, bất kỳ bộ kích hoạt nào cho bảng cũng bị loại bỏ. Tên kích hoạt tồn tại trong không gian tên lược đồ, có nghĩa là tất cả các yếu tố kích hoạt phải có tên duy nhất trong lược đồ. Các kích hoạt trong các lược đồ khác nhau có thể có cùng tên. Có thể xác định nhiều trình kích hoạt cho một bảng nhất định có cùng một sự kiện kích hoạt và thời gian hành động. Ví dụ: bạn có thể có hai kích hoạt 0 cho một bảng. Theo mặc định, các kích hoạt có cùng một sự kiện kích hoạt và thời gian hành động kích hoạt theo thứ tự chúng được tạo. Để ảnh hưởng đến thứ tự kích hoạt, chỉ định một mệnh đề sau 9 chỉ ra 2 hoặc 3 và tên của một kích hoạt hiện có cũng có cùng một sự kiện và thời gian hành động. Với 2, trình kích hoạt mới sẽ kích hoạt sau khi kích hoạt hiện có. Với 3, trình kích hoạt mới sẽ kích hoạt trước khi kích hoạt hiện có.Ví dụ: định nghĩa kích hoạt sau đây xác định một kích hoạt 6 khác cho bảng 2:
Trình kích hoạt này, 8, tương tự như 1 nhưng tích lũy tiền gửi và rút tiền riêng biệt. Nó có một mệnh đề 3 khiến nó kích hoạt trước 1; Nếu không có điều khoản đó, nó sẽ kích hoạt sau 1 vì nó được tạo sau 1.Trong phần thân kích hoạt, các từ khóa 4 và 5 cho phép bạn truy cập các cột trong các hàng bị ảnh hưởng bởi một kích hoạt. 4 và 5 là các phần mở rộng MySQL để kích hoạt; Họ không nhạy cảm với trường hợp.Trong trình kích hoạt 9, chỉ có thể sử dụng 9; Không có hàng cũ. Trong kích hoạt 7, chỉ có thể sử dụng 1; Không có hàng mới. Trong trình kích hoạt 8, bạn có thể sử dụng 1 để chỉ các cột của một hàng trước khi nó được cập nhật và 9 để tham khảo các cột của hàng sau khi được cập nhật.Một cột có tên với 4 chỉ được đọc. Bạn có thể tham khảo nó (nếu bạn có đặc quyền 6), nhưng không sửa đổi nó. Bạn có thể tham khảo một cột có tên với 5 nếu bạn có đặc quyền 6 cho nó. Trong trình kích hoạt 3, bạn cũng có thể thay đổi giá trị của nó bằng 0 = 1 nếu bạn có đặc quyền 8 cho nó. Điều này có nghĩa là bạn có thể sử dụng trình kích hoạt để sửa đổi các giá trị sẽ được chèn vào một hàng mới hoặc được sử dụng để cập nhật một hàng. .Trong trình kích hoạt 3, giá trị 5 cho cột 7 là 0, không phải là số trình tự được tạo tự động khi hàng mới thực sự được chèn.Bằng cách sử dụng cấu trúc 8, bạn có thể xác định trình kích hoạt thực thi nhiều câu lệnh. Trong khối 9, bạn cũng có thể sử dụng cú pháp khác được phép trong các thói quen được lưu trữ như điều kiện và vòng lặp. Tuy nhiên, giống như đối với các thói quen được lưu trữ, nếu bạn sử dụng chương trình MySQL để xác định trình kích hoạt thực thi nhiều câu lệnh, thì cần phải xác định lại dấu phân cách câu lệnh MySQL để bạn có thể sử dụng dấu phân cách câu lệnh 0 trong định nghĩa kích hoạt. Ví dụ sau đây minh họa những điểm này. Nó xác định trình kích hoạt 8 kiểm tra giá trị mới sẽ được sử dụng để cập nhật từng hàng và sửa đổi giá trị nằm trong phạm vi từ 0 đến 100. Đây phải là kích hoạt 3 vì giá trị phải được kiểm tra trước khi nó được sử dụng để cập nhật hàng:mysql program to define a trigger that executes multiple statements, it is necessary to redefine the mysql statement delimiter so that you can use the 0 statement
delimiter within the trigger definition. The following example illustrates these points. It defines an 8 trigger that checks the new value to be used for updating each row, and modifies the value to be within the range from 0 to 100. This must be a 3 trigger because the value must be checked before it is used to update the row:
Có thể dễ dàng hơn để xác định một quy trình được lưu trữ riêng biệt và sau đó gọi nó từ bộ kích hoạt bằng cách sử dụng câu lệnh 3 đơn giản. Điều này cũng thuận lợi nếu bạn muốn thực thi cùng một mã từ trong một số kích hoạt.Có những hạn chế về những gì có thể xuất hiện trong các câu lệnh thực thi khi được kích hoạt:
Xem thêm Phần & NBSP; 25.8, Hạn chế trên các chương trình được lưu trữ. MySQL xử lý các lỗi trong quá trình thực thi kích hoạt như sau:
Trình kích hoạt có thể chứa các tham chiếu trực tiếp đến các bảng theo tên, chẳng hạn như trình kích hoạt có tên 7 hiển thị trong ví dụ này:
Giả sử bạn chèn các giá trị sau vào Bảng 8 như được hiển thị ở đây:
Do đó, bốn bảng chứa các dữ liệu sau: 0
Làm thế nào bạn có thể truy cập giá trị mới bên trong trình kích hoạt trong MySQL?Trả lời: Mới. Qty tham chiếu QTY trên bảng mà bộ kích hoạt được đặt trên, không phải bảng đang được cập nhật. Tạo Trigger After_sales_insert Sau khi chèn vào bán hàng cho mỗi hàng Bắt đầu Cập nhật Sản phẩm Đặt QTy = Qty - Mới.CREATE TRIGGER after_sales_insert AFTER INSERT ON sales FOR EACH ROW BEGIN UPDATE products SET qty = qty - NEW.
Tại sao không được khuyến nghị kích hoạt?Theo kinh nghiệm của tôi, chúng không phải là một ý tưởng tốt bởi vì chúng có thể dẫn đến các tác dụng phụ đáng ngạc nhiên và rất khó để gỡ lỗi (đặc biệt là khi một người kích hoạt bắn người khác).Thường thì các nhà phát triển thậm chí không nghĩ đến việc tìm kiếm nếu có một kích hoạt.they can result in surprising side effects, and are difficult to debug (especially when one trigger fires another). Often developers do not even think of looking if there is a trigger.
Cái gì mới và cũ trong bộ kích hoạt MySQL?Trong thân kích hoạt, các từ khóa cũ và mới cho phép bạn truy cập các cột trong các hàng bị ảnh hưởng bởi một trình kích hoạt.Cũ và mới là các phần mở rộng MySQL để kích hoạt;Họ không nhạy cảm với trường hợp.Trong một kích hoạt chèn, chỉ mới.Col_name có thể được sử dụng;Không có hàng cũ.OLD and NEW are MySQL extensions to triggers; they are not case-sensitive. In an INSERT trigger, only NEW. col_name can be used; there is no old row.
Trigger mới và cũ là gì?Giới thiệu về giả cũ và mới cho một kích hoạt chèn, cũ không chứa giá trị và mới chứa các giá trị mới.Đối với một kích hoạt cập nhật, cũ chứa các giá trị cũ và mới chứa các giá trị mới.Đối với một trình kích hoạt xóa, cũ chứa các giá trị cũ và mới không chứa giá trị.For an INSERT trigger, OLD contains no values, and NEW contains the new values. For an UPDATE trigger, OLD contains the old values, and NEW contains the new values. For a DELETE trigger, OLD contains the old values, and NEW contains no values. |