MySQL更新后触发器
简介:在本教程中,您将学习如何创建MySQL AFTER UPDATE触发器来记录对表所做的更改。
MySQL AFTER UPDATE触发器简介
在与触发器关联的表上发生更新事件后,将自动调用MySQL AFTER UPDATE触发器。
下面显示了创建MySQL AFTER UPDATE触发器的语法:
CREATE TRIGGER trigger_name AFTER UPDATE ON table_name FOR EACH ROW trigger_body
使用以下语法:
首先,在CREATE TRIGGER子句中指定要创建的触发器的名称。
其次,使用AFTER UPDATE子句指定调用触发器的时间。
第三,在ON关键字之后指定触发器所属的表的名称。
最后,指定由一个或多个语句组成的触发器主体。
如果触发器主体具有多个语句,则需要使用BEGIN END块。
并且,您还需要更改默认定界符,如以下代码所示:
DELIMITER $$
CREATE TRIGGER trigger_name
AFTER UPDATE
ON table_name FOR EACH ROW
BEGIN
-- statements
END$$
DELIMITER ;
在AFTER UPDATE触发器中,您可以访问OLD和NEW行,但不能更新它们。
MySQL AFTER UPDATE触发器示例
让我们看一个创建AFTER UPDATE触发器的示例。
设置样本表
首先,创建一个名为Sales的表:
DROP TABLE IF EXISTS Sales;
CREATE TABLE Sales (
id INT AUTO_INCREMENT,
product VARCHAR(100) NOT NULL,
quantity INT NOT NULL DEFAULT 0,
fiscalYear SMALLINT NOT NULL,
fiscalMonth TINYINT NOT NULL,
CHECK(fiscalMonth >= 1 AND fiscalMonth <= 12),
CHECK(fiscalYear BETWEEN 2000 and 2050),
CHECK (quantity >=0),
UNIQUE(product, fiscalYear, fiscalMonth),
PRIMARY KEY(id)
);
其次,将示例数据插入Sales表:
INSERT INTO Sales(product, quantity, fiscalYear, fiscalMonth)
VALUES
('2001 Ferrari Enzo',140, 2021,1),
('1998 Chrysler Plymouth Prowler', 110,2021,1),
('1913 Ford Model T Speedster', 120,2021,1);
第三,从Sales表中查询数据以显示其内容:
SELECT * FROM Sales;
最后,创建一个表来存储销售表中数量列中的更改:
DROP TABLE IF EXISTS SalesChanges;
CREATE TABLE SalesChanges (
id INT AUTO_INCREMENT PRIMARY KEY,
salesId INT,
beforeQuantity INT,
afterQuantity INT,
changedAt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
创建AFTER UPDATE触发器示例
以下语句在sales表上创建AFTER UPDATE触发器:
DELIMITER $$
CREATE TRIGGER after_sales_update
AFTER UPDATE
ON sales FOR EACH ROW
BEGIN
IF OLD.quantity <> new.quantity THEN
INSERT INTO SalesChanges(salesId,beforeQuantity, afterQuantity)
VALUES(old.id, old.quantity, new.quantity);
END IF;
END$$
DELIMITER ;
在sales表中的每一行发生更新事件之前,将自动触发after_sales_update触发器。
如果将"数量"列中的值更新为新值,触发器将插入新行以将更改记录在SalesChanges表中。
让我们详细研究一下触发器:
首先,触发器的名称是在CREATE TRIGGER子句中指定的after_sales_update:
CREATE TRIGGER after_sales_update
其次,触发事件是:
AFTER UPDATE
第三,与触发器关联的表是sales:
ON Sales FOR EACH ROW
最后,使用触发器主体中的IF-THEN语句检查新值是否与旧值不同,然后将更改插入SalesChanges表中:
IF OLD.quantity <> new.quantity THEN
INSERT INTO SalesChanges(salesId,beforeQuantity, afterQuantity)
VALUES(old.id, old.quantity, new.quantity);
END IF;
测试MySQL AFTER UPDATE触发器
首先,将ID为1的行的数量更新为350:
UPDATE Sales SET quantity = 350 WHERE id = 1;
after_sales_update被自动调用。
其次,从SalesChanges表中查询数据:
SELECT * FROM SalesChanges;
第三,将所有行的销售额增加到10%:
UPDATE Sales SET quantity = CAST(quantity * 1.1 AS UNSIGNED);
第四,从SalesChanges表中查询数据:
SELECT * FROM SalesChanges;
由于三行的更新,触发器触发了三次。
在本教程中,您学习了如何创建MySQL AFTER UPDATE触发器以在将数据更新到表之前验证数据。

