MySQL BEFORE INSERT Trigger

摘要:在本教程中,您将学习如何创建 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 触发器

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)
MySQL BEFORE INSERT 触发器示例 2

触发器已按预期将总容量从 100 更新为 200。

请注意,为了正确维护汇总表WorkCenterStats ,您还应该创建触发器来处理WorkCenters表上的更新和删除事件。

在本教程中,您学习了如何创建 MySQL BEFORE INSERT触发器来维护另一个表的汇总表。

本教程有帮助吗?