摘要:在本教程中,您将学习如何创建 MySQL BEFORE INSERT
触发器来维护另一个表的汇总表。
MySQL BEFORE INSERT
触发器简介
MySQL BEFORE INSERT
触发器在表上发生插入事件之前自动触发。
下面说明了创建 MySQL BEFORE INSERT
触发器的基本语法:
CREATE TRIGGER trigger_name
BEFORE INSERT
ON table_name FOR EACH ROW
trigger_body;
Code language: SQL (Structured Query Language) (sql)
在这个语法中:
首先,在CREATE TRIGGER
子句中指定要创建的触发器的名称。
其次,使用BEFORE INSERT
子句指定调用触发器的时间。
第三,在ON
关键字后指定触发器关联的表的名称。
最后,指定触发器主体,其中包含一个或多个在调用触发器时执行的 SQL 语句。
如果您在trigger_body
中有多个语句,则必须使用BEGIN END
块并更改默认分隔符:
DELIMITER $$
CREATE TRIGGER trigger_name
BEFORE INSERT
ON table_name FOR EACH ROW
BEGIN
-- statements
END$$
DELIMITER ;
Code language: SQL (Structured Query Language) (sql)
请注意,在BEFORE INSERT
触发器中,您可以访问和更改NEW
值。但是,您无法访问OLD
值,因为OLD
值显然不存在。
MySQL BEFORE INSERT
触发器示例
我们将创建一个BEFORE INSERT
触发器来维护另一个表的汇总表。
设置样本表
首先,创建一个名为WorkCenters
的新表:
DROP TABLE IF EXISTS WorkCenters;
CREATE TABLE WorkCenters (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
capacity INT NOT NULL
);
Code language: SQL (Structured Query Language) (sql)
其次,创建另一个名为WorkCenterStats
表,用于存储工作中心容量的摘要:
DROP TABLE IF EXISTS WorkCenterStats;
CREATE TABLE WorkCenterStats(
totalCapacity INT NOT NULL
);
Code language: SQL (Structured Query Language) (sql)
创建BEFORE INSERT
触发器示例
在将新工作中心插入WorkCenterStats
表之前,以下触发器会更新WorkCenter
表中的总容量:
DELIMITER $$
CREATE TRIGGER before_workcenters_insert
BEFORE INSERT
ON WorkCenters FOR EACH ROW
BEGIN
DECLARE rowcount INT;
SELECT COUNT(*)
INTO rowcount
FROM WorkCenterStats;
IF rowcount > 0 THEN
UPDATE WorkCenterStats
SET totalCapacity = totalCapacity + new.capacity;
ELSE
INSERT INTO WorkCenterStats(totalCapacity)
VALUES(new.capacity);
END IF;
END $$
DELIMITER ;
Code language: SQL (Structured Query Language) (sql)
在此触发器中:
首先,触发器的名称是CREATE TRIGGER
子句中指定的before_workcenters_insert
:
CREATE TRIGGER before_workcenters_insert
Code language: SQL (Structured Query Language) (sql)
其次,触发事件是:
BEFORE INSERT
Code language: SQL (Structured Query Language) (sql)
第三,触发器关联的表是WorkCenters
表:
ON WorkCenters FOR EACH ROW
Code language: SQL (Structured Query Language) (sql)
最后,在触发器主体内,我们检查WorkCenterStats
表中是否有任何行。
如果表WorkCenterStats
有一行,触发器会将容量添加到totalCapacity
列。否则,它将在WorkCenterStats
表中插入新行。
测试 MySQL BEFORE INSERT
触发器
首先,在WorkCenter
表中插入一个新行:
INSERT INTO WorkCenters(name, capacity)
VALUES('Mold Machine',100);
Code language: SQL (Structured Query Language) (sql)
其次,从WorkCenterStats
表中查询数据:
SELECT * FROM WorkCenterStats;
Code language: SQL (Structured Query Language) (sql)
已调用触发器并将新行插入到WorkCenterStats
表中。
三、插入新的工作中心:
INSERT INTO WorkCenters(name, capacity)
VALUES('Packing',200);
Code language: SQL (Structured Query Language) (sql)
最后,从WorkCenterStats
查询数据:
SELECT * FROM WorkCenterStats;
Code language: SQL (Structured Query Language) (sql)
触发器已按预期将总容量从 100 更新为 200。
请注意,为了正确维护汇总表WorkCenterStats
,您还应该创建触发器来处理WorkCenters
表上的更新和删除事件。
在本教程中,您学习了如何创建 MySQL BEFORE INSERT
触发器来维护另一个表的汇总表。