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

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

    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 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.

  • 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;
    
    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 độ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 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 độ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;
    
    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.

  • Tuyên bố 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 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ột
    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)
    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ột
    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)
    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ột
    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)
    1 sẽ được chèn vào hàng mới.the value of the
    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)
    1 column to be inserted into the new row.

Để 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<0,-NEW.amount,0);
Query OK, 0 rows affected (0.01 sec)

Trình kích hoạt này,

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 |
+-----------------------+
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<0,-NEW.amount,0);
Query OK, 0 rows affected (0.01 sec)
1; Không có hàng mới. 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;
8, bạn 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<0,-NEW.amount,0);
Query OK, 0 rows affected (0.01 sec)
1 để chỉ các cột của một hàng trước khi nó được cập nhật và
mysql> 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<0,-NEW.amount,0);
Query OK, 0 rows affected (0.01 sec)
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
mysql> 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<0,-NEW.amount,0);
Query OK, 0 rows affected (0.01 sec)
6 cho nó. 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, bạn cũng có thể thay đổi giá trị của nó bằng
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 ;
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

    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 để 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. .

  • 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ư

    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);
    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ặc
    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);
    9. (
    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
    0 được cho phép vì nó không kết thúc giao dịch.).

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

    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 không thành công, hoạt động trên hàng tương ứng không được thực hiện.

  • 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 đượ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.

  • 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;
    
    4 chỉ được thực thi nếu bất kỳ 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 nào và hoạt động hàng thực hiện thành công.

  • Một lỗi trong quá 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 hoặ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;
    
    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.

  • Đố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

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.