Mysql 简明教程

MySQL - Before Delete Trigger

在 MySQL 中,触发器被定义为一个特殊的存储过程,它驻留在系统目录中,并在执行事件时执行。它被称为特殊存储过程,因为它不需要像其他存储过程那样显式调用。每当所需的事件被触发时,触发器都会自动执行。触发器分为两类 -

  1. Before Triggers

  2. After Triggers

这些触发器可以响应表上的插入操作、更新操作或删除操作。因此,每当执行 INSERT、UPDATE 或 DELETE 语句时,这些特殊存储过程就会响应。

MySQL Before Delete Trigger

Before Delete Trigger 是 MySQL 数据库支持的行级触发器。Before Delete Trigger 在从数据库表的一行中删除值之前立即执行。

有了这个触发器,每当在数据库中执行 DELETE 语句时,值会被首先从表中删除,然后执行触发器集。

Syntax

以下是 MySQL 中创建 BEFORE DELETE 触发器的语法 -

CREATE TRIGGER trigger_name
BEFORE DELETE ON table_name FOR EACH ROW
BEGIN
   -- trigger body
END;

Example

在此示例中,我们使用以下查询创建一个名为 'CUSTOMERS' 的表,以演示 BEFORE DELETE 触发器 -

CREATE TABLE CUSTOMERS(
   ID INT NOT NULL,
   NAME VARCHAR(20) NOT NULL,
   AGE INT NOT NULL,
   ADDRESS VARCHAR(25),
   SALARY DECIMAL(18, 2),
   PRIMARY KEY(ID)
);

使用以下 INSERT 语句向创建的表中插入值 -

INSERT INTO CUSTOMERS VALUES
(1, 'Ramesh', 32, 'Ahmedabad', 2000.00 ),
(2, 'Khilan', 25, 'Delhi', 1500.00 ),
(3, 'Kaushik', 23, 'Kota', 2000.00 ),
(4, 'Chaitali', 25, 'Mumbai', 6500.00 ),
(5, 'Hardik', 27, 'Bhopal', 8500.00 ),
(6, 'Komal', 22, 'MP', 4500.00 ),
(7, 'Muffy', 24, 'Indore', 10000.00 );

Creating Another Table

现在,让我们创建一个另一个空表,以存储从主表 'CUSTOMERS' 中删除的所有以前客户 -

CREATE TABLE OLD_CUSTOMERS (
   ID INT NOT NULL,
   NAME VARCHAR(20) NOT NULL,
   AGE INT NOT NULL,
   ADDRESS VARCHAR(25),
   SALARY DECIMAL(18, 2),
   PRIMARY KEY(ID)
);

使用以下 CREATE TRIGGER 语句在 CUSTOMERS 表上创建一个新的触发器 'before_delete_trigger',以从 CUSTOMERS 表中删除客户详细信息并将其插入到另一个表 'OLD_CUSTOMERS' 中 -

DELIMITER //
CREATE TRIGGER before_delete_trigger
BEFORE DELETE ON CUSTOMERS
FOR EACH ROW
BEGIN
 INSERT INTO OLD_CUSTOMERS VALUES
 (OLD.ID, OLD.NAME, OLD.AGE, OLD.ADDRESS, OLD.SALARY);
END //
DELIMITER ;

使用如下所示的常规 DELETE 语句从 CUSTOMERS 表中删除 'old' 客户的详细信息 -

DELETE FROM CUSTOMERS WHERE ID = 3;

Verification

为了验证是否已从 OCUSTOMERS 表中删除详细信息并添加到 OLD_CUSTOMERS 表中,让我们尝试使用 SELECT 查询检索这两个结果集。

CUSTOMERS 表中的记录如下 -

OLD_CUSTOMERS 表中的记录如下 -

正如您在上面的表格中看到的那样,数据已经从 CUSTOMERS 表中删除并添加到 OLD_CUSTOMERS 表中。

Before Delete Trigger Using Client Program

我们还可以使用客户端程序而不是 SQL 查询执行 Before Delete 触发器语句。

Syntax

Example

以下是这些程序 −