跳到主要内容

SQL 删除触发器

SQL 触发器是一种特殊的存储过程,它在特定事件(如插入、更新或删除)发生时自动执行。删除触发器(DELETE Trigger)是一种在删除操作发生时触发的触发器。它通常用于在删除数据时执行额外的操作,例如记录日志、维护数据完整性或级联删除。

什么是删除触发器?

删除触发器是与表相关联的数据库对象,当从表中删除一行或多行数据时,触发器会自动执行。它可以用于以下场景:

  • 记录删除操作:将删除的数据记录到日志表中。
  • 维护数据完整性:确保删除操作不会破坏数据库的完整性。
  • 级联删除:删除相关表中的数据。

删除触发器的语法

以下是创建删除触发器的基本语法:

sql
CREATE TRIGGER trigger_name
AFTER DELETE
ON table_name
FOR EACH ROW
BEGIN
-- 触发器逻辑
END;
  • trigger_name:触发器的名称。
  • AFTER DELETE:指定触发器在删除操作之后执行。
  • table_name:触发器关联的表名。
  • FOR EACH ROW:表示触发器对每一行删除操作都会执行。
  • BEGIN ... END:触发器的主体,包含要执行的 SQL 语句。
备注

在某些数据库系统中(如 MySQL),触发器只能在 AFTER DELETEBEFORE DELETE 时触发,而不能在删除操作期间触发。

删除触发器的示例

假设我们有一个 orders 表和一个 order_archive 表。每当从 orders 表中删除一条记录时,我们希望将该记录存档到 order_archive 表中。

创建表

首先,创建 ordersorder_archive 表:

sql
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_name VARCHAR(100),
order_date DATE
);

CREATE TABLE order_archive (
order_id INT PRIMARY KEY,
customer_name VARCHAR(100),
order_date DATE,
deleted_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

创建删除触发器

接下来,创建一个删除触发器,将删除的记录存档到 order_archive 表中:

sql
CREATE TRIGGER archive_deleted_order
AFTER DELETE
ON orders
FOR EACH ROW
BEGIN
INSERT INTO order_archive (order_id, customer_name, order_date)
VALUES (OLD.order_id, OLD.customer_name, OLD.order_date);
END;

测试触发器

现在,当我们从 orders 表中删除一条记录时,触发器会自动将删除的记录插入到 order_archive 表中。

sql
-- 删除一条记录
DELETE FROM orders WHERE order_id = 1;

-- 查询 order_archive 表
SELECT * FROM order_archive;

输出:

order_idcustomer_nameorder_datedeleted_at
1John Doe2023-10-012023-10-01 12:00:00
提示

在触发器中,OLD 关键字用于引用被删除的行的值。

实际应用场景

场景 1:记录删除日志

在某些系统中,记录删除操作是非常重要的。例如,在财务系统中,删除交易记录时需要记录删除的时间、操作人等信息。删除触发器可以自动将这些信息插入到日志表中。

场景 2:级联删除

在关系数据库中,如果删除主表中的记录,可能需要同时删除从表中的相关记录。例如,删除一个客户时,可能需要删除该客户的所有订单。删除触发器可以实现这一功能。

sql
CREATE TRIGGER delete_customer_orders
AFTER DELETE
ON customers
FOR EACH ROW
BEGIN
DELETE FROM orders WHERE customer_id = OLD.customer_id;
END;

总结

删除触发器是 SQL 中强大的工具,可以在删除操作发生时自动执行额外的逻辑。通过本文,您已经了解了删除触发器的基本概念、语法以及实际应用场景。希望这些知识能帮助您在数据库设计中更好地使用触发器。

附加资源

练习

  1. 创建一个删除触发器,当从 employees 表中删除一条记录时,将该记录插入到 employee_archive 表中。
  2. 修改上述触发器,使其在删除记录时同时记录删除操作的用户和时间。

通过实践这些练习,您将更深入地理解删除触发器的用法。