本文首发:https://kalacloud.com/blog/how-to-manage-and-use-mysql-database-triggers
文章目录
触发器(Trigger)是 MySQL 中非常实用的一个功能,它可以在操作者对表进行「增删改」 之前(或之后)被触发,自动执行一段事先写好的 SQL 代码。
本教程带领大家在实践中学习,你将学到触发器在实际应用场景中的重要应用。
在这个教程中,你是「卡拉云银行」的程序员,你正在搭建一套银行客户管理系统。在这套系统中,你需要设置在INSERT
表之前检测操作者是否输入错误数据、在 UPDATE
时,记录操作者的行为 log ,以及在DELETE
时,判断删除的信息是否符合删除规则。 这三类操作都可以使用 MySQL 触发器来实现。
如果你正在数据库的基础上搭建一套数据库管理工具或企业内部工具,推荐你试试我开发的卡拉云,详情见后文。
本教程将带你一起实践的案例
BEFORE INSERT
: 在插入数据前,检测插入数据是否符合业务逻辑,如不符合返回错误信息。AFTER INSERT
: 在表 A 创建新账户后,将创建成功信息自动写入表 B 中。BEFORE UPDATE
:在更新数据前,检测更新数据是否符合业务逻辑,如不符合返回错误信息。AFTER INSERT
:在更新数据后,将操作行为记录在 log 中BEFORE DELETE
:在删除数据前,检查是否有关联数据,如有,停止删除操作。AFTER DELETE
:删除表 A 信息后,自动删除表 B 中与表 A 相关联的信息。
先决条件
在开始之前,请确保您具备以下条件:
创建示例数据库
我们先创建一个干净的示例数据库,方便大家可以跟随本教程一起实践。我们会在这个数据库中演示 MySQL 触发器的多种工作方式。
首先,以 root 身份登录到你的 MySQL 服务器:
mysql -u root -p
出现提示时,请输入你 MySQL root 账号的密码,然后点击 ENTER
继续。看到 mysql>
提示后,运行以下命令,创建 demo_kalacloud
数据库:
CREATE database demo_kalacloud;
Output
Query OK, 1 row affected (0.00 sec)
接下来,切换到新建的 demo_kalacloud
数据库:
USE demo_kalacloud;
Output
Database changed
接着创建一个 customers
表。我们使用这个表记录银行客户的信息。这个表包括 customer_id
,customer_name
,和level
。咱们先把客户分为两个级别:BASIC
和VIP
。
create table customers(
customer_id BIGINT PRIMARY KEY,
customer_name VARCHAR(50),
level VARCHAR(50)
) ENGINE=INNODB;
Output
Query OK, 0 rows affected (0.01 sec)
接着,我们向 customers
表中添加一些客户记录。
Insert into customers (customer_id, customer_name, level )values('1','Jack Ma','BASIC');
Insert into customers (customer_id, customer_name, level )values('2','Robin Li','BASIC');
Insert into customers (customer_id, customer_name, level )values('3','Pony Ma','VIP');
分别运行三个 INSERT
命令后,命令行输出成功信息。
Output
Query OK, 1 row affected (0.01 sec)
我们使用 SELECT
检查一下三条信息是否已经写入表中:
Select * from customers;
下面我们创建另一个表customer_status
,用于保存 customers
表中客户的备注信息。
这个表包含 customer_id
和 status_notes
字段:
Create table customer_status(customer_id BIGINT PRIMARY KEY, status_notes VARCHAR(50)) ENGINE=INNODB;
然后,我们再创建一个 sales
表,这个表与 customer_id
关联。保存与客户有关的销售数据。
Create table sales(sales_id BIGINT PRIMARY KEY, customer_id