MySQL BEFORE INSERT触发器

简介:在本教程中,您将学习如何在INSERT触发器之前创建MySQL以维护另一个表的摘要表。

INSERT触发器之前的MySQL简介

在表上发生插入事件之前,将自动触发MySQL INSERT之前的触发器。

下面说明了创建MySQL BEFORE INSERT触发器的基本语法:

CREATE TRIGGER trigger_name
    BEFORE INSERT
    ON table_name FOR EACH ROW
trigger_body;

使用以下语法:

首先,在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 ;

请注意,在BEFORE INSERT触发器中,您可以访问和更改NEW值。
但是,由于显然不存在OLD值,因此您无法访问OLD值。

MySQL 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
);

其次,创建另一个名为WorkCenterStats的表,该表存储工作中心容量的摘要:

DROP TABLE IF EXISTS WorkCenterStats;

CREATE TABLE WorkCenterStats(
    totalCapacity INT NOT NULL
);

创建INSERT之前的触发器示例

在将新的工作中心插入WorkCenter表之前,以下触发器将更新WorkCenterStats表中的总容量:

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 ;

在此触发器中:

首先,触发器的名称是在CREATE TRIGGER子句中指定的before_workcenters_insert:

CREATE TRIGGER before_workcenters_insert

其次,触发事件是:

BEFORE INSERT

第三,与触发器关联的表是WorkCenters表:

ON WorkCenters FOR EACH ROW

最后,在触发器主体内部,我们检查WorkCenterStats表中是否有任何行。

如果表WorkCenterStats有一行,则触发器将容量添加到totalCapacity列。
否则,它将在WorkCenterStats表中插入新行。

在INSERT触发器之前测试MySQL

首先,在WorkCenter表中插入新行:

INSERT INTO WorkCenters(name, capacity)
VALUES('Mold Machine',100);

其次,从WorkCenterStats表中查询数据:

SELECT * FROM WorkCenterStats;

触发器已被调用,并将新行插入到WorkCenterStats表中。

第三,插入一个新的工作中心:

INSERT INTO WorkCenters(name, capacity)
VALUES('Packing',200);

最后,从WorkCenterStats查询数据:

SELECT * FROM WorkCenterStats;

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

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

在本教程中,您学习了如何在INSERT触发器之前创建MySQL以维护另一个表的摘要表。

日期:2019-11-20 08:52:18 来源:oir作者:oir