Mysql 创建一个触发器,实现两表之间同步
生活中有很多的触发器,就是例如如果一个学校不能过分亲密,触发器就是地点的问题,会规定什么地点,触发的时间,例如你刚进公园的时候,饭前便后要洗手,吃饭之前触发了触发器,
1.创建商品表
CREATE TABLE `g` (
`id` int(11) DEFAULT NULL,
`name` varchar(256) DEFAULT NULL,
`num` int
) charset utf8;
创建订单表
CREATE TABLE `o` (
`oid` int(11) DEFAULT NULL,
`gid`int,
`much` int DEFAULT NULL
) charset utf8;
Insert into g values(1,'猪',22),(2,'羊',19),(3,'狗',12),(4,'猫',8)
买三只羊
2号商品,3个
Insert into o values(1,2,3)
减少羊的库存
Update g set num =num-3 where id =2;
那为什么不是订单发起,羊的数量自动减少呢。
1 监视地点o 表
2 监视操作:insert
3 触发操作:update
4 触发时间:after
Create trigger triggerName After/before insert/update/delete on 表名
For each row 这行是写死的,是行触发器,但是oracle 中还有表触发器,但是mysql 中只有行触发器
Begin
Sql 语句
End
Create trigger tg1 After insert on o
For each row
Begin
Update g set num =num-3 where id =2;
End
Insert into o values(2,2,3)
O 表的变化
G表的变化
触发器是自动触发的,当执行完insert 语句的时候就自动触发了
当买两只羊的时候,insertinto o values(3,2,2)
再买两头猪 insertinto(5,1,2);
这样写触发器肯定是不行,不管是买啥都是少羊
如何在触发器引用新的行
对于insert 而言,新增的行用new 表示
行中的每一列的值,用new .列名来表示
删除触发器,droptrigger tg1;
Show triggers;
创建触发器tg2
Create trigger tg2
After insert on o
For each row
Begin
Update g set num =num-new.much where id =new .gid;
End
买一只猫
insert into values(1,4,1)
原来是
买完是
G表原来是这样的
Eg:删除一个订单,库存相应的增加
监视地点o表:
监视事件 delete
触发事件update:
触发时间:after
Create trigger tg3
After delete on o
For each row
Begin
update g set num = num +old.much where id =old.gid;
end
原来的o 表
创建了触发器以后,进行delete 操作
Delete from o where oid =3;
G表原来是这样的
现在是这样的
触发器注意事项:触发器不区分数据库,一旦创建了,就是在全局是有效的,在创建新的触发器之前,一定要把原来的触发器删除才可以
修改订单的数量时,库存相应的改变
监视地点:o表
监视事件:update
触发事件:update
监视时间:after
对于delete 来说,原本有一行后来被删除,想引用删除一行,用old 表示,old 列名就可以引用被删除的行中的值
对于update被修改的行修改前的数据状态用old 来表示,old 列名引用被修改之前的行中的值,被修改后的数据用new 来表示,new列名应用被修改之后的行中的值
Create trigger tg4
After update on o
For each row
Begin
Update g set num = num+old.much-new.much where id =old.gid;
End
G 表原来是
Update o set much = 5 where oid =1;
O 表原来是
O表现在是
Update o set much = 1 where oid =1;
相同的event 的触发器只能是一个,不能是多个,如果想创建多个是报错的,必须要把原来相同的触发方式的删除