Làm thế nào tôi có thể truy cập các giá trị của bảng
DELIMITER $$
CREATE TRIGGER after_sales_insert
AFTER INSERT ON sales
FOR EACH ROW BEGIN
UPDATE products
SET NEW.qty = OLD.qty - INSERTED.qty
WHERE sku = INSERTED.sku;
END;
$$
DELIMITER;
1 trong một kích hoạt?Ví dụ:
INSERT INTO sales [sku, qty]
VALUES
[1001, 5], //I need these values in the trigger
[1002, 1]
...
Đây là kích hoạt của tôi:
DELIMITER $$
CREATE TRIGGER after_sales_insert
AFTER INSERT ON sales
FOR EACH ROW BEGIN
UPDATE products
SET NEW.qty = OLD.qty - INSERTED.qty
WHERE sku = INSERTED.sku;
END;
$$
DELIMITER;
Lưu ý rằng
DELIMITER $$
CREATE TRIGGER after_sales_insert
AFTER INSERT ON sales
FOR EACH ROW BEGIN
UPDATE products
SET NEW.qty = OLD.qty - INSERTED.qty
WHERE sku = INSERTED.sku;
END;
$$
DELIMITER;
2 là khóa ngoại cho bảng DELIMITER $$
CREATE TRIGGER after_sales_insert
AFTER INSERT ON sales
FOR EACH ROW BEGIN
UPDATE products
SET NEW.qty = OLD.qty - INSERTED.qty
WHERE sku = INSERTED.sku;
END;
$$
DELIMITER;
3.SQL Server có từ khóa
DELIMITER $$
CREATE TRIGGER after_sales_insert
AFTER INSERT ON sales
FOR EACH ROW BEGIN
UPDATE products
SET NEW.qty = OLD.qty - INSERTED.qty
WHERE sku = INSERTED.sku;
END;
$$
DELIMITER;
1, dường như không hoạt động cho MySQL.Answer:
DELIMITER $$
CREATE TRIGGER after_sales_insert
AFTER INSERT ON sales
FOR EACH ROW BEGIN
UPDATE products
SET NEW.qty = OLD.qty - INSERTED.qty
WHERE sku = INSERTED.sku;
END;
$$
DELIMITER;
5 Tài liệu tham khảo DELIMITER $$
CREATE TRIGGER after_sales_insert
AFTER INSERT ON sales
FOR EACH ROW BEGIN
UPDATE products
SET NEW.qty = OLD.qty - INSERTED.qty
WHERE sku = INSERTED.sku;
END;
$$
DELIMITER;
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.CREATE TRIGGER after_sales_insert
AFTER INSERT ON sales
FOR EACH ROW BEGIN
UPDATE products
SET qty = qty - NEW.qty
WHERE sku = NEW.sku;
END;
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
DELIMITER $$
CREATE TRIGGER after_sales_insert
AFTER INSERT ON sales
FOR EACH ROW BEGIN
UPDATE products
SET NEW.qty = OLD.qty - INSERTED.qty
WHERE sku = INSERTED.sku;
END;
$$
DELIMITER;
7 hoặc DELIMITER $$
CREATE TRIGGER after_sales_insert
AFTER INSERT ON sales
FOR EACH ROW BEGIN
UPDATE products
SET NEW.qty = OLD.qty - INSERTED.qty
WHERE sku = INSERTED.sku;
END;
$$
DELIMITER;
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
DELIMITER $$
CREATE TRIGGER after_sales_insert
AFTER INSERT ON sales
FOR EACH ROW BEGIN
UPDATE products
SET NEW.qty = OLD.qty - INSERTED.qty
WHERE sku = INSERTED.sku;
END;
$$
DELIMITER;
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.mysql> CREATE TABLE account [acct_num INT, amount DECIMAL[10,2]];
Query OK, 0 rows affected [0.03 sec]
mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account
FOR EACH ROW SET @sum = @sum + NEW.amount;
Query OK, 0 rows affected [0.01 sec]
Câu lệnh
DELIMITER $$
CREATE TRIGGER after_sales_insert
AFTER INSERT ON sales
FOR EACH ROW BEGIN
UPDATE products
SET NEW.qty = OLD.qty - INSERTED.qty
WHERE sku = INSERTED.sku;
END;
$$
DELIMITER;
7 tạo ra một kích hoạt có tên CREATE TRIGGER after_sales_insert
AFTER INSERT ON sales
FOR EACH ROW BEGIN
UPDATE products
SET qty = qty - NEW.qty
WHERE sku = NEW.sku;
END;
1 được liên kết với bảng CREATE TRIGGER after_sales_insert
AFTER INSERT ON sales
FOR EACH ROW BEGIN
UPDATE products
SET qty = qty - NEW.qty
WHERE sku = NEW.sku;
END;
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:Từ khóa
3 cho biết thời gian hành động kích hoạt. Trong trường hợp này, kích hoạt kích hoạt trước mỗi hàng được chèn vào bảng. Từ khóa được phép khác ở đây làCREATE TRIGGER after_sales_insert AFTER INSERT ON sales FOR EACH ROW BEGIN UPDATE products SET qty = qty - NEW.qty WHERE sku = NEW.sku; END;
4.CREATE TRIGGER after_sales_insert AFTER INSERT ON sales FOR EACH ROW BEGIN UPDATE products SET qty = qty - NEW.qty WHERE sku = NEW.sku; END;
Từ khóa
9 chỉ ra sự kiện kích hoạt; Đó là, loại hoạt động kích hoạt kích hoạt. Trong ví dụ, các hoạt độngDELIMITER $$ CREATE TRIGGER after_sales_insert AFTER INSERT ON sales FOR EACH ROW BEGIN UPDATE products SET NEW.qty = OLD.qty - INSERTED.qty WHERE sku = INSERTED.sku; END; $$ DELIMITER;
9 gây ra kích hoạt kích hoạt. Bạn cũng có thể tạo các kích hoạt cho các hoạt độngDELIMITER $$ CREATE TRIGGER after_sales_insert AFTER INSERT ON sales FOR EACH ROW BEGIN UPDATE products SET NEW.qty = OLD.qty - INSERTED.qty WHERE sku = INSERTED.sku; END; $$ DELIMITER;
7 vàCREATE TRIGGER after_sales_insert AFTER INSERT ON sales FOR EACH ROW BEGIN UPDATE products SET qty = qty - NEW.qty WHERE sku = NEW.sku; END;
8.CREATE TRIGGER after_sales_insert AFTER INSERT ON sales FOR EACH ROW BEGIN UPDATE products SET qty = qty - NEW.qty WHERE sku = NEW.sku; END;
Tuyên bố sau
9 xác định thân kích hoạt; Đó là, câu lệnh để thực thi mỗi lần kích hoạt kích hoạt, xảy ra một lần cho mỗi hàng bị ảnh hưởng bởi sự kiện kích hoạt. Trong ví dụ, thân kích hoạt là mộtCREATE TRIGGER after_sales_insert AFTER INSERT ON sales FOR EACH ROW BEGIN UPDATE products SET qty = qty - NEW.qty WHERE sku = NEW.sku; END;
0 đơn giản tích lũy vào biến người dùng, các giá trị được chèn vào cộtmysql> CREATE TABLE account [acct_num INT, amount DECIMAL[10,2]]; Query OK, 0 rows affected [0.03 sec] mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account FOR EACH ROW SET @sum = @sum + NEW.amount; Query OK, 0 rows affected [0.01 sec]
1. Câu lệnh đề cập đến cột làmysql> CREATE TABLE account [acct_num INT, amount DECIMAL[10,2]]; Query OK, 0 rows affected [0.03 sec] mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account FOR EACH ROW SET @sum = @sum + NEW.amount; Query OK, 0 rows affected [0.01 sec]
2 có nghĩa là giá trị của cộtmysql> CREATE TABLE account [acct_num INT, amount DECIMAL[10,2]]; Query OK, 0 rows affected [0.03 sec] mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account FOR EACH ROW SET @sum = @sum + NEW.amount; Query OK, 0 rows affected [0.01 sec]
1 sẽ được chèn vào hàng mới.“the value of themysql> CREATE TABLE account [acct_num INT, amount DECIMAL[10,2]]; Query OK, 0 rows affected [0.03 sec] mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account FOR EACH ROW SET @sum = @sum + NEW.amount; Query OK, 0 rows affected [0.01 sec]
1 column to be inserted into the new row.”mysql> CREATE TABLE account [acct_num INT, amount DECIMAL[10,2]]; Query OK, 0 rows affected [0.03 sec] mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account FOR EACH ROW SET @sum = @sum + NEW.amount; Query OK, 0 rows affected [0.01 sec]
Để 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
DELIMITER $$
CREATE TRIGGER after_sales_insert
AFTER INSERT ON sales
FOR EACH ROW BEGIN
UPDATE products
SET NEW.qty = OLD.qty - INSERTED.qty
WHERE sku = INSERTED.sku;
END;
$$
DELIMITER;
9 và sau đó xem giá trị nào biến có sau đó:mysql> SET @sum = 0;
mysql> INSERT INTO account VALUES[137,14.98],[141,1937.50],[97,-100.00];
mysql> SELECT @sum AS 'Total amount inserted';
+-----------------------+
| Total amount inserted |
+-----------------------+
| 1852.48 |
+-----------------------+
Trong trường hợp này, giá trị của
mysql> CREATE TABLE account [acct_num INT, amount DECIMAL[10,2]];
Query OK, 0 rows affected [0.03 sec]
mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account
FOR EACH ROW SET @sum = @sum + NEW.amount;
Query OK, 0 rows affected [0.01 sec]
5 sau tuyên bố DELIMITER $$
CREATE TRIGGER after_sales_insert
AFTER INSERT ON sales
FOR EACH ROW BEGIN
UPDATE products
SET NEW.qty = OLD.qty - INSERTED.qty
WHERE sku = INSERTED.sku;
END;
$$
DELIMITER;
9 đã được thực thi là mysql> CREATE TABLE account [acct_num INT, amount DECIMAL[10,2]];
Query OK, 0 rows affected [0.03 sec]
mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account
FOR EACH ROW SET @sum = @sum + NEW.amount;
Query OK, 0 rows affected [0.01 sec]
7 hoặc mysql> CREATE TABLE account [acct_num INT, amount DECIMAL[10,2]];
Query OK, 0 rows affected [0.03 sec]
mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account
FOR EACH ROW SET @sum = @sum + NEW.amount;
Query OK, 0 rows affected [0.01 sec]
8.Để phá hủy kích hoạt, sử dụng câu lệnh
mysql> CREATE TABLE account [acct_num INT, amount DECIMAL[10,2]];
Query OK, 0 rows affected [0.03 sec]
mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account
FOR EACH ROW SET @sum = @sum + NEW.amount;
Query OK, 0 rows affected [0.01 sec]
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:mysql> DROP TRIGGER test.ins_sum;
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
mysql> SET @sum = 0;
mysql> INSERT INTO account VALUES[137,14.98],[141,1937.50],[97,-100.00];
mysql> SELECT @sum AS 'Total amount inserted';
+-----------------------+
| Total amount inserted |
+-----------------------+
| 1852.48 |
+-----------------------+
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 CREATE TRIGGER after_sales_insert
AFTER INSERT ON sales
FOR EACH ROW BEGIN
UPDATE products
SET qty = qty - NEW.qty
WHERE sku = NEW.sku;
END;
9 chỉ ra mysql> SET @sum = 0;
mysql> INSERT INTO account VALUES[137,14.98],[141,1937.50],[97,-100.00];
mysql> SELECT @sum AS 'Total amount inserted';
+-----------------------+
| Total amount inserted |
+-----------------------+
| 1852.48 |
+-----------------------+
2 hoặc mysql> SET @sum = 0;
mysql> INSERT INTO account VALUES[137,14.98],[141,1937.50],[97,-100.00];
mysql> SELECT @sum AS 'Total amount inserted';
+-----------------------+
| Total amount inserted |
+-----------------------+
| 1852.48 |
+-----------------------+
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 mysql> SET @sum = 0;
mysql> INSERT INTO account VALUES[137,14.98],[141,1937.50],[97,-100.00];
mysql> SELECT @sum AS 'Total amount inserted';
+-----------------------+
| Total amount inserted |
+-----------------------+
| 1852.48 |
+-----------------------+
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 mysql> SET @sum = 0;
mysql> INSERT INTO account VALUES[137,14.98],[141,1937.50],[97,-100.00];
mysql> SELECT @sum AS 'Total amount inserted';
+-----------------------+
| Total amount inserted |
+-----------------------+
| 1852.48 |
+-----------------------+
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
mysql> SET @sum = 0;
mysql> INSERT INTO account VALUES[137,14.98],[141,1937.50],[97,-100.00];
mysql> SELECT @sum AS 'Total amount inserted';
+-----------------------+
| Total amount inserted |
+-----------------------+
| 1852.48 |
+-----------------------+
6 khác cho bảng CREATE TRIGGER after_sales_insert
AFTER INSERT ON sales
FOR EACH ROW BEGIN
UPDATE products
SET qty = qty - NEW.qty
WHERE sku = NEW.sku;
END;
2:mysql> CREATE TRIGGER ins_transaction BEFORE INSERT ON account
FOR EACH ROW PRECEDES ins_sum
SET
@deposits = @deposits + IF[NEW.amount>0,NEW.amount,0],
@withdrawals = @withdrawals + IF[NEW.amount SET @sum = 0;
mysql> INSERT INTO account VALUES[137,14.98],[141,1937.50],[97,-100.00];
mysql> SELECT @sum AS 'Total amount inserted';
+-----------------------+
| Total amount inserted |
+-----------------------+
| 1852.48 |
+-----------------------+
8, tương tự như CREATE TRIGGER after_sales_insert
AFTER INSERT ON sales
FOR EACH ROW BEGIN
UPDATE products
SET qty = qty - NEW.qty
WHERE sku = NEW.sku;
END;
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 đề mysql> SET @sum = 0;
mysql> INSERT INTO account VALUES[137,14.98],[141,1937.50],[97,-100.00];
mysql> SELECT @sum AS 'Total amount inserted';
+-----------------------+
| Total amount inserted |
+-----------------------+
| 1852.48 |
+-----------------------+
3 khiến nó kích hoạt trước CREATE TRIGGER after_sales_insert
AFTER INSERT ON sales
FOR EACH ROW BEGIN
UPDATE products
SET qty = qty - NEW.qty
WHERE sku = NEW.sku;
END;
1; Nếu không có điều khoản đó, nó sẽ kích hoạt sau CREATE TRIGGER after_sales_insert
AFTER INSERT ON sales
FOR EACH ROW BEGIN
UPDATE products
SET qty = qty - NEW.qty
WHERE sku = NEW.sku;
END;
1 vì nó được tạo sau CREATE TRIGGER after_sales_insert
AFTER INSERT ON sales
FOR EACH ROW BEGIN
UPDATE products
SET qty = qty - NEW.qty
WHERE sku = NEW.sku;
END;
1.Trong phần thân kích hoạt, các từ khóa
mysql> DROP TRIGGER test.ins_sum;
4 và mysql> DROP TRIGGER test.ins_sum;
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. mysql> DROP TRIGGER test.ins_sum;
4 và mysql> DROP TRIGGER test.ins_sum;
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
DELIMITER $$
CREATE TRIGGER after_sales_insert
AFTER INSERT ON sales
FOR EACH ROW BEGIN
UPDATE products
SET NEW.qty = OLD.qty - INSERTED.qty
WHERE sku = INSERTED.sku;
END;
$$
DELIMITER;
9, chỉ có thể sử dụng mysql> DROP TRIGGER test.ins_sum;
9; Không có hàng cũ. Trong kích hoạt CREATE TRIGGER after_sales_insert
AFTER INSERT ON sales
FOR EACH ROW BEGIN
UPDATE products
SET qty = qty - NEW.qty
WHERE sku = NEW.sku;
END;
7, chỉ có thể sử dụng mysql> CREATE TRIGGER ins_transaction BEFORE INSERT ON account
FOR EACH ROW PRECEDES ins_sum
SET
@deposits = @deposits + IF[NEW.amount>0,NEW.amount,0],
@withdrawals = @withdrawals + IF[NEW.amount CREATE TRIGGER ins_transaction BEFORE INSERT ON account
FOR EACH ROW PRECEDES ins_sum
SET
@deposits = @deposits + IF[NEW.amount>0,NEW.amount,0],
@withdrawals = @withdrawals + IF[NEW.amount DROP TRIGGER test.ins_sum;
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
mysql> DROP TRIGGER test.ins_sum;
4 chỉ được đọc. Bạn có thể tham khảo nó [nếu bạn có đặc quyền mysql> CREATE TRIGGER ins_transaction BEFORE INSERT ON account
FOR EACH ROW PRECEDES ins_sum
SET
@deposits = @deposits + IF[NEW.amount>0,NEW.amount,0],
@withdrawals = @withdrawals + IF[NEW.amount DROP TRIGGER test.ins_sum;
5 nếu bạn có đặc quyền mysql> CREATE TRIGGER ins_transaction BEFORE INSERT ON account
FOR EACH ROW PRECEDES ins_sum
SET
@deposits = @deposits + IF[NEW.amount>0,NEW.amount,0],
@withdrawals = @withdrawals + IF[NEW.amount delimiter //
mysql> CREATE TRIGGER upd_check BEFORE UPDATE ON account
FOR EACH ROW
BEGIN
IF NEW.amount < 0 THEN
SET NEW.amount = 0;
ELSEIF NEW.amount > 100 THEN
SET NEW.amount = 100;
END IF;
END;//
mysql> delimiter ;
0 = mysql> delimiter //
mysql> CREATE TRIGGER upd_check BEFORE UPDATE ON account
FOR EACH ROW
BEGIN
IF NEW.amount < 0 THEN
SET NEW.amount = 0;
ELSEIF NEW.amount > 100 THEN
SET NEW.amount = 100;
END IF;
END;//
mysql> delimiter ;
1 nếu bạn có đặc quyền CREATE TRIGGER after_sales_insert
AFTER INSERT ON sales
FOR EACH ROW BEGIN
UPDATE products
SET qty = qty - NEW.qty
WHERE sku = NEW.sku;
END;
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
CREATE TRIGGER after_sales_insert
AFTER INSERT ON sales
FOR EACH ROW BEGIN
UPDATE products
SET qty = qty - NEW.qty
WHERE sku = NEW.sku;
END;
3, giá trị mysql> DROP TRIGGER test.ins_sum;
5 cho cột mysql> delimiter //
mysql> CREATE TRIGGER upd_check BEFORE UPDATE ON account
FOR EACH ROW
BEGIN
IF NEW.amount < 0 THEN
SET NEW.amount = 0;
ELSEIF NEW.amount > 100 THEN
SET NEW.amount = 100;
END IF;
END;//
mysql> delimiter ;
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
mysql> delimiter //
mysql> CREATE TRIGGER upd_check BEFORE UPDATE ON account
FOR EACH ROW
BEGIN
IF NEW.amount < 0 THEN
SET NEW.amount = 0;
ELSEIF NEW.amount > 100 THEN
SET NEW.amount = 100;
END IF;
END;//
mysql> delimiter ;
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 mysql> delimiter //
mysql> CREATE TRIGGER upd_check BEFORE UPDATE ON account
FOR EACH ROW
BEGIN
IF NEW.amount < 0 THEN
SET NEW.amount = 0;
ELSEIF NEW.amount > 100 THEN
SET NEW.amount = 100;
END IF;
END;//
mysql> delimiter ;
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 CREATE TABLE test1[a1 INT];
CREATE TABLE test2[a2 INT];
CREATE TABLE test3[a3 INT NOT NULL AUTO_INCREMENT PRIMARY KEY];
CREATE TABLE test4[
a4 INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
b4 INT DEFAULT 0
];
delimiter |
CREATE TRIGGER testref BEFORE INSERT ON test1
FOR EACH ROW
BEGIN
INSERT INTO test2 SET a2 = NEW.a1;
DELETE FROM test3 WHERE a3 = NEW.a1;
UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1;
END;
|
delimiter ;
INSERT INTO test3 [a3] VALUES
[NULL], [NULL], [NULL], [NULL], [NULL],
[NULL], [NULL], [NULL], [NULL], [NULL];
INSERT INTO test4 [a4] VALUES
[0], [0], [0], [0], [0], [0], [0], [0], [0], [0];
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 CREATE TRIGGER after_sales_insert
AFTER INSERT ON sales
FOR EACH ROW BEGIN
UPDATE products
SET qty = qty - NEW.qty
WHERE sku = NEW.sku;
END;
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 CREATE TRIGGER after_sales_insert
AFTER INSERT ON sales
FOR EACH ROW BEGIN
UPDATE products
SET qty = qty - NEW.qty
WHERE sku = NEW.sku;
END;
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 CREATE TABLE test1[a1 INT];
CREATE TABLE test2[a2 INT];
CREATE TABLE test3[a3 INT NOT NULL AUTO_INCREMENT PRIMARY KEY];
CREATE TABLE test4[
a4 INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
b4 INT DEFAULT 0
];
delimiter |
CREATE TRIGGER testref BEFORE INSERT ON test1
FOR EACH ROW
BEGIN
INSERT INTO test2 SET a2 = NEW.a1;
DELETE FROM test3 WHERE a3 = NEW.a1;
UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1;
END;
|
delimiter ;
INSERT INTO test3 [a3] VALUES
[NULL], [NULL], [NULL], [NULL], [NULL],
[NULL], [NULL], [NULL], [NULL], [NULL];
INSERT INTO test4 [a4] VALUES
[0], [0], [0], [0], [0], [0], [0], [0], [0], [0];
0 statement
delimiter within the trigger definition. The following example illustrates these points. It defines an CREATE TRIGGER after_sales_insert
AFTER INSERT ON sales
FOR EACH ROW BEGIN
UPDATE products
SET qty = qty - NEW.qty
WHERE sku = NEW.sku;
END;
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 CREATE TRIGGER after_sales_insert
AFTER INSERT ON sales
FOR EACH ROW BEGIN
UPDATE products
SET qty = qty - NEW.qty
WHERE sku = NEW.sku;
END;
3 trigger because the value must be checked before it is used to update the row: mysql> delimiter //
mysql> CREATE TRIGGER upd_check BEFORE UPDATE ON account
FOR EACH ROW
BEGIN
IF NEW.amount < 0 THEN
SET NEW.amount = 0;
ELSEIF NEW.amount > 100 THEN
SET NEW.amount = 100;
END IF;
END;//
mysql> delimiter ;
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
CREATE TABLE test1[a1 INT];
CREATE TABLE test2[a2 INT];
CREATE TABLE test3[a3 INT NOT NULL AUTO_INCREMENT PRIMARY KEY];
CREATE TABLE test4[
a4 INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
b4 INT DEFAULT 0
];
delimiter |
CREATE TRIGGER testref BEFORE INSERT ON test1
FOR EACH ROW
BEGIN
INSERT INTO test2 SET a2 = NEW.a1;
DELETE FROM test3 WHERE a3 = NEW.a1;
UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1;
END;
|
delimiter ;
INSERT INTO test3 [a3] VALUES
[NULL], [NULL], [NULL], [NULL], [NULL],
[NULL], [NULL], [NULL], [NULL], [NULL];
INSERT INTO test4 [a4] VALUES
[0], [0], [0], [0], [0], [0], [0], [0], [0], [0];
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:
Trình kích hoạt không thể sử dụng câu lệnh
3 để gọi các quy trình được lưu trữ trả lại dữ liệu cho máy khách hoặc sử dụng SQL động. .CREATE TABLE test1[a1 INT]; CREATE TABLE test2[a2 INT]; CREATE TABLE test3[a3 INT NOT NULL AUTO_INCREMENT PRIMARY KEY]; CREATE TABLE test4[ a4 INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b4 INT DEFAULT 0 ]; delimiter | CREATE TRIGGER testref BEFORE INSERT ON test1 FOR EACH ROW BEGIN INSERT INTO test2 SET a2 = NEW.a1; DELETE FROM test3 WHERE a3 = NEW.a1; UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1; END; | delimiter ; INSERT INTO test3 [a3] VALUES [NULL], [NULL], [NULL], [NULL], [NULL], [NULL], [NULL], [NULL], [NULL], [NULL]; INSERT INTO test4 [a4] VALUES [0], [0], [0], [0], [0], [0], [0], [0], [0], [0];
Trình kích hoạt không thể sử dụng các câu lệnh rõ ràng hoặc ngầm bắt đầu hoặc kết thúc một giao dịch, chẳng hạn như
7,CREATE TABLE test1[a1 INT]; CREATE TABLE test2[a2 INT]; CREATE TABLE test3[a3 INT NOT NULL AUTO_INCREMENT PRIMARY KEY]; CREATE TABLE test4[ a4 INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b4 INT DEFAULT 0 ]; delimiter | CREATE TRIGGER testref BEFORE INSERT ON test1 FOR EACH ROW BEGIN INSERT INTO test2 SET a2 = NEW.a1; DELETE FROM test3 WHERE a3 = NEW.a1; UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1; END; | delimiter ; INSERT INTO test3 [a3] VALUES [NULL], [NULL], [NULL], [NULL], [NULL], [NULL], [NULL], [NULL], [NULL], [NULL]; INSERT INTO test4 [a4] VALUES [0], [0], [0], [0], [0], [0], [0], [0], [0], [0];
8 hoặcCREATE TABLE test1[a1 INT]; CREATE TABLE test2[a2 INT]; CREATE TABLE test3[a3 INT NOT NULL AUTO_INCREMENT PRIMARY KEY]; CREATE TABLE test4[ a4 INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b4 INT DEFAULT 0 ]; delimiter | CREATE TRIGGER testref BEFORE INSERT ON test1 FOR EACH ROW BEGIN INSERT INTO test2 SET a2 = NEW.a1; DELETE FROM test3 WHERE a3 = NEW.a1; UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1; END; | delimiter ; INSERT INTO test3 [a3] VALUES [NULL], [NULL], [NULL], [NULL], [NULL], [NULL], [NULL], [NULL], [NULL], [NULL]; INSERT INTO test4 [a4] VALUES [0], [0], [0], [0], [0], [0], [0], [0], [0], [0];
9. [CREATE TABLE test1[a1 INT]; CREATE TABLE test2[a2 INT]; CREATE TABLE test3[a3 INT NOT NULL AUTO_INCREMENT PRIMARY KEY]; CREATE TABLE test4[ a4 INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b4 INT DEFAULT 0 ]; delimiter | CREATE TRIGGER testref BEFORE INSERT ON test1 FOR EACH ROW BEGIN INSERT INTO test2 SET a2 = NEW.a1; DELETE FROM test3 WHERE a3 = NEW.a1; UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1; END; | delimiter ; INSERT INTO test3 [a3] VALUES [NULL], [NULL], [NULL], [NULL], [NULL], [NULL], [NULL], [NULL], [NULL], [NULL]; INSERT INTO test4 [a4] VALUES [0], [0], [0], [0], [0], [0], [0], [0], [0], [0];
0 được cho phép vì nó không kết thúc giao dịch.].mysql> INSERT INTO test1 VALUES [1], [3], [1], [7], [1], [8], [4], [4]; Query OK, 8 rows affected [0.01 sec] Records: 8 Duplicates: 0 Warnings: 0
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:
Nếu kích hoạt
3 không thành công, hoạt động trên hàng tương ứng không được thực hiện.CREATE TRIGGER after_sales_insert AFTER INSERT ON sales FOR EACH ROW BEGIN UPDATE products SET qty = qty - NEW.qty WHERE sku = NEW.sku; END;
Trình kích hoạt
3 được kích hoạt bởi nỗ lực chèn hoặc sửa đổi hàng, bất kể cố gắng sau đó có thành công hay không.attempt to insert or modify the row, regardless of whether the attempt subsequently succeeds.CREATE TRIGGER after_sales_insert AFTER INSERT ON sales FOR EACH ROW BEGIN UPDATE products SET qty = qty - NEW.qty WHERE sku = NEW.sku; END;
Trình kích hoạt
4 chỉ được thực thi nếu bất kỳ kích hoạtCREATE TRIGGER after_sales_insert AFTER INSERT ON sales FOR EACH ROW BEGIN UPDATE products SET qty = qty - NEW.qty WHERE sku = NEW.sku; END;
3 nào và hoạt động hàng thực hiện thành công.CREATE TRIGGER after_sales_insert AFTER INSERT ON sales FOR EACH ROW BEGIN UPDATE products SET qty = qty - NEW.qty WHERE sku = NEW.sku; END;
Một lỗi trong quá trình kích hoạt
3 hoặcCREATE TRIGGER after_sales_insert AFTER INSERT ON sales FOR EACH ROW BEGIN UPDATE products SET qty = qty - NEW.qty WHERE sku = NEW.sku; END;
4 dẫn đến sự thất bại của toàn bộ câu lệnh gây ra lời mời kích hoạt.CREATE TRIGGER after_sales_insert AFTER INSERT ON sales FOR EACH ROW BEGIN UPDATE products SET qty = qty - NEW.qty WHERE sku = NEW.sku; END;
Đối với các bảng giao dịch, thất bại của một tuyên bố sẽ gây ra sự cuộn lại tất cả các thay đổi được thực hiện bởi tuyên bố. Thất bại của một kích hoạt khiến tuyên bố thất bại, do đó lỗi kích hoạt cũng gây ra sự cuộn lại. Đối với các bảng không chuyển hóa, việc quay lại như vậy không thể được thực hiện, vì vậy mặc dù câu lệnh không thành công, bất kỳ thay đổi nào được thực hiện trước điểm lỗi vẫn có hiệu lực.
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
mysql> INSERT INTO test1 VALUES
[1], [3], [1], [7], [1], [8], [4], [4];
Query OK, 8 rows affected [0.01 sec]
Records: 8 Duplicates: 0 Warnings: 0
7 hiển thị trong ví dụ này:CREATE TABLE test1[a1 INT];
CREATE TABLE test2[a2 INT];
CREATE TABLE test3[a3 INT NOT NULL AUTO_INCREMENT PRIMARY KEY];
CREATE TABLE test4[
a4 INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
b4 INT DEFAULT 0
];
delimiter |
CREATE TRIGGER testref BEFORE INSERT ON test1
FOR EACH ROW
BEGIN
INSERT INTO test2 SET a2 = NEW.a1;
DELETE FROM test3 WHERE a3 = NEW.a1;
UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1;
END;
|
delimiter ;
INSERT INTO test3 [a3] VALUES
[NULL], [NULL], [NULL], [NULL], [NULL],
[NULL], [NULL], [NULL], [NULL], [NULL];
INSERT INTO test4 [a4] VALUES
[0], [0], [0], [0], [0], [0], [0], [0], [0], [0];
Giả sử bạn chèn các giá trị sau vào Bảng
mysql> INSERT INTO test1 VALUES
[1], [3], [1], [7], [1], [8], [4], [4];
Query OK, 8 rows affected [0.01 sec]
Records: 8 Duplicates: 0 Warnings: 0
8 như được hiển thị ở đây:mysql> INSERT INTO test1 VALUES
[1], [3], [1], [7], [1], [8], [4], [4];
Query OK, 8 rows affected [0.01 sec]
Records: 8 Duplicates: 0 Warnings: 0
Do đó, bốn bảng chứa các dữ liệu sau:
DELIMITER $$
CREATE TRIGGER after_sales_insert
AFTER INSERT ON sales
FOR EACH ROW BEGIN
UPDATE products
SET NEW.qty = OLD.qty - INSERTED.qty
WHERE sku = INSERTED.sku;
END;
$$
DELIMITER;
0