MySQL - 删除前触发

MySQL - 删除前触发 首页 / MySQL入门教程 / MySQL - 删除前触发

删除前只要在表上触发删除操作,MySQL中的触发器就会自动调用。在本文中,无涯教程将学习如何使用其语法和示例创建删除前触发器。

语法

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

CREATE TRIGGER trigger_name 
BEFORE DELETE
ON table_name FOR EACH ROW
Trigger_body ;

BEFORE DELETE触发器语法参数可以解释如下:

  • 首先,将指定无涯教程要创建的触发器的名称。它在架构中应该是唯一的。
  • 第二,将指定触发动作时间,该时间应为DELETE之前。在表的每一行更改发生之前,将触发此触发器。
  • 第三,将指定与触发器关联的表的名称。它必须写在ON关键字之后。如果不指定表名,则触发器将不存在。
  • 最后,将指定触发触发器时要执行的语句。

如果要执行多个语句,则将使用包含一组查询的BEGIN END块来定义触发器的逻辑。请参见以下语法:

DELIMITER $$ 
CREATE TRIGGER trigger_name BEFORE DELETE
ON table_name FOR EACH ROW
BEGIN
   variable declarations
   trigger code
END$$
DELIMITER ;

限制条件

  • 可以访问OLD行,但是无法在DELETE触发器之前更新它们。
  • 无法访问NEW行。这是因为不存在新行。
  • 无法在VIEW上创建BEFORE DELETE触发器。

删除之前触发示例

让无涯教程通过示例了解如何使用 MySQL中的CREATE TRIGGER语句创建删除前触发器。

假设创建了一个名为薪金的表来存储员工的薪水信息,如下所示:

CREATE TABLE salaries (
    emp_num INT PRIMARY KEY,
    valid_from DATE NOT NULL,
    amount DEC(8 , 2 ) NOT NULL DEFAULT 0
);

接下来,将使用以下语句将一些记录插入该表:

无涯教程网

INSERT INTO salaries (emp_num, valid_from, amount)
VALUES
    (102, '2020-01-10', 45000),
    (103, '2020-01-10', 65000),
    (105, '2020-01-10', 55000),
    (107, '2020-01-10', 70000),
    (109, '2020-01-10', 40000);

执行SELECT查询以查看表数据。

MySQL BEFORE DELETE Trigger

第三,无涯教程将创建另一个名为salary_archives的表,该表保留已删除工资的信息。

CREATE TABLE salary_archives (
    id INT PRIMARY KEY AUTO_INCREMENT,
    emp_num INT,
    valid_from DATE NOT NULL,
    amount DEC(18 , 2 ) NOT NULL DEFAULT 0,
    deleted_time TIMESTAMP DEFAULT NOW()
);

然后,将创建一个BEFORE DELETE触发器,该触发器将新记录插入salary_archives表中,然后再从salaries表中删除一行。

DELIMITER $$

CREATE TRIGGER before_delete_salaries
BEFORE DELETE
ON salaries FOR EACH ROW
BEGIN
    INSERT INTO salary_archives (emp_num, valid_from, amount)
    VALUES(OLD. emp_num, OLD.valid_from, OLD.amount);
END$$ 

DELIMITER ;
MySQL BEFORE DELETE Trigger

在此触发器中,无涯教程首先指定了触发器名称before_delete_salaries。然后,指定触发事件。第三,指定了与触发器关联的表名。最后,在触发器主体内编写了触发器逻辑,该逻辑将已删除的行插入salary_archives表中。

如何调用删除前触发器?

让无涯教程测试上面创建的BEFORE DELETE触发器以及如何调用它们。因此,首先,将从薪金表中删除一行:

mysql> DELETE FROM salaries WHERE emp_num = 105;

其次,将通过使用select语句从salary_archives表中查询数据,以验证是否创建了上面创建的触发器:

链接:https://www.learnfk.comhttps://www.learnfk.com/mysql/mysql-before-delete-trigger.html

来源:LearnFk无涯教程网

mysql> SELECT * FROM salary_archives;

执行完一条语句后,可以看到触发器已成功调用并将新记录插入salary_archives表中。

MySQL BEFORE DELETE Trigger

第三,将从工资表中删除所有行:

mysql> DELETE FROM salaries;

最后,无涯教程将再次查询salary_archives表中的数据。该触发器被调用了四次,因为DELETE语句从salaries表中删除了四条记录。请参见以下输出:

MySQL BEFORE DELETE Trigger

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

Service Mesh实践指南 -〔周晶〕

微服务架构实战160讲 -〔杨波〕

代码精进之路 -〔范学雷〕

Swift核心技术与实战 -〔张杰〕

DDD实战课 -〔欧创新〕

张汉东的Rust实战课 -〔张汉东〕

物联网开发实战 -〔郭朝斌〕

陶辉的网络协议集训班02期 -〔陶辉〕

大数据经典论文解读 -〔徐文浩〕

好记忆不如烂笔头。留下您的足迹吧 :)