触发器
我们使用MySQL
的过程中可能会有下边这些需求:
-
在向
t1
表插入或更新数据之前对自动对数据进行校验,要求m1
列的值必须在1~10
之间,校验规则如下:- 如果插入的记录的
m1
列的值小于1
,则按1
插入。 - 如果
m1
列的值大于10
,则按10
插入。
- 如果插入的记录的
-
在向
t1
表中插入记录之后自动把这条记录插入到t2
表。
也就是我们在对表中的记录做增、删、改操作前和后都可能需要让MySQL
服务器自动执行一些额外的语句,这个就是所谓的触发器
的应用场景。
创建触发器
我们看一下定义触发器
的语句:
CREATE TRIGGER 触发器名
{BEFORE|AFTER}
{INSERT|DELETE|UPDATE}
ON 表名
FOR EACH ROW
BEGIN
触发器内容
END
小贴士:
由大括号`{}`包裹并且内部用竖线`|`分隔的语句表示必须在给定的选项中选取一个值,比如`{BEFORE|AFTER}`表示必须在`BEFORE`、`AFTER`这两个之间选取一个。
其中{BEFORE|AFTER}
表示触发器内容执行的时机,它们的含义如下:
名称 | 描述 |
---|---|
BEFORE |
表示在具体的语句执行之前就开始执行触发器的内容 |
AFTER |
表示在具体的语句执行之后才开始执行触发器的内容 |
{INSERT|DELETE|UPDATE}
表示具体的语句,MySQL
中目前只支持对INSERT
、DELETE
、UPDATE
这三种类型的语句设置触发器。
FOR EACH ROW BEGIN ... END
表示对具体语句影响的每一条记录都执行我们自定义的触发器内容:
-
对于
INSERT
语句来说,FOR EACH ROW
影响的记录就是我们准备插入的那些新记录。 -
对于
DELETE
语句和UPDATE
语句来说,FOR EACH ROW
影响的记录就是符合WHERE
条件的那些记录(如果语句中没有WHERE
条件,那就是代表全部的记录)。
小贴士: 如果触发器内容只包含一条语句,那也可以省略BEGN、END这两个词儿。
因为MySQL
服务器会对某条语句影响的所有记录依次调用我们自定义的触