MySQL删除前触发器
简介:在本教程中,您将学习如何在删除前创建MySQL触发器,以将已删除的行添加到存档表中。
删除触发器之前的MySQL简介
在表中发生删除事件之前,会自动触发MySQL BEFORE DELETE触发器。
这是创建MySQL BEFORE DELETE触发器的基本语法:
CREATE TRIGGER trigger_name BEFORE DELETE ON table_name FOR EACH ROW trigger_body
使用以下语法:
首先,在CREATE TRIGGER关键字之后指定要创建的触发器的名称。
其次,使用BEFORE DELETE子句指定在删除事件之前立即调用触发器。
第三,在ON关键字之后指定触发器与之关联的表的名称。
最后,指定触发器主体,该主体由触发触发器时执行的一个或多个语句组成。
请注意,如果trigger_body中有多个语句,则需要使用BEGIN END块包装这些语句,并临时更改默认定界符,如下所示:
DELIMITER $$ CREATE TRIGGER trigger_name BEFORE DELETE ON table_name FOR EACH ROW BEGIN -- statements END$$ DELIMITER ;
在"删除前"触发器中,您可以访问OLD行,但不能更新它。
另外,BEFORE DELETE触发器中没有NEW行。
MySQL BEFORE DELETE触发器示例
让我们看下面的"删除前"触发器示例。
设置样本表
首先,创建一个名为Salaries的新表,该表存储员工的薪水信息
DROP TABLE IF EXISTS Salaries; CREATE TABLE Salaries ( employeeNumber INT PRIMARY KEY, validFrom DATE NOT NULL, amount DEC(12 , 2 ) NOT NULL DEFAULT 0 );
其次,在Salaries表中插入一些行:
INSERT INTO salaries(employeeNumber,validFrom,amount) VALUES (1002,'2000-01-01',50000), (1056,'2000-01-01',60000), (1076,'2000-01-01',70000);
第三,创建一个存储已删除工资的表:
DROP TABLE IF EXISTS SalaryArchives; CREATE TABLE SalaryArchives ( id INT PRIMARY KEY AUTO_INCREMENT, employeeNumber INT PRIMARY KEY, validFrom DATE NOT NULL, amount DEC(12 , 2 ) NOT NULL DEFAULT 0, deletedAt TIMESTAMP DEFAULT NOW() );
创建删除前触发器示例
在删除Salaries表中的一行之前,以下BEFORE DELETE触发器将新行插入SalaryArchives表中。
DELIMITER $$ CREATE TRIGGER before_salaries_delete BEFORE DELETE ON salaries FOR EACH ROW BEGIN INSERT INTO SalaryArchives(employeeNumber,validFrom,amount) VALUES(OLD.employeeNumber,OLD.validFrom,OLD.amount); END$$ DELIMITER ;
在此触发器中:
首先,触发器的名称是在CREATE TRIGGER子句中指定的before_salaries_delete:
CREATE TRIGGER before_salaries_delete
其次,触发事件是:
BEFORE DELETE
第三,与触发器关联的表是Salaries表:
ON Salaries FOR EACH ROW
最后,在触发器主体内部,将已删除的行插入SalaryArchives表中。
在删除前测试MySQL
首先,从Salaries表中删除一行:
DELETE FROM salaries WHERE employeeNumber = 1002;
其次,从SalaryArchives表中查询数据:
SELECT * FROM SalaryArchives;
触发器被调用,并将新行插入SalaryArchives表。
第三,从Salaries表中删除所有行:
DELETE FROM salaries;
最后,从SalaryArchives表中查询数据:
SELECT * FROM SalaryArchives;
该触发器被触发两次,因为DELETE语句从Salaries表中删除了两行。
在本教程中,您学习了如何在删除前的行中创建MySQL,以将已删除的行添加到存档表中。