触发器创建
delimiter $$ //delimiter 修改mysql定界符为 $$
create trigger triggerName after/before insert/update/delete
on tableName for each row
begin
...; //将要触发执行的sql语句,注意最后的分号
end;
$$ //告诉mysql 语句结束,开始执行语句啦
delimiter ; //重新修改mysql定界符为默认的 ;
触发器语句中有两个特殊的表:old 表和 new 表。
表名 | 作用 |
---|---|
old 表 | 用于存储 delete 和 update 语句所影响的旧行的副本 |
new 表 | 用于存储 insert 和 update 语句所影响的新行的副本 |
1、触发insert: new表有数据,old表无数据
2、触发delete: new表无数据,old表有数据
3、触发update:new表有数据(新数据),old表有数据(旧数据)
案例
1、目录表
CREATE TABLE `catalog` (
`id` bigint(20) NOT NULL,
`pid` bigint(20) NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
//插入数据
insert into catalog VALUES (1,0),(2,1),(3,0);
创建触发器:删除父id之前,儿子id也要先删除
create trigger triggerdDel before delete
on catalog for each row
begin
delete from catalog c WHERE c.pid = old.id;
end;
执行删除测试
delete from catalog c WHERE c.id = 1;
报错如下
1442 - Can’t update table ‘catalog’ in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
原因:
1、MYSQL中触发器中不能对本表进行 insert ,update ,delete操作,以免递归循环触发。
2、只能借助第二张表才能实现需要的目的。
3、将要触发的sql 操作其他表是可以的。