mysql (十一):触发器

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 的触发器只能是一个,不能是多个,如果想创建多个是报错的,必须要把原来相同的触发方式的删除

猜你喜欢

转载自blog.csdn.net/qq_20610631/article/details/82057064