mysql 系统库中增加触发器_MySQL数据库中的触发器

--触发器是一类特殊的监控增删改操作,并产生相应的增删改的操作

--1,监视谁 2,监视动作 3,监视时间(之前或之后) 4,触发的事件

--触发器的简单语法

create trigger 触发器名字 after/before(触发时间)

insert/delete/update(监视事件) on 表名 (监视地址)

for each row begin sql语句; end;

--因为一条sql语句只能有一个边界符,所以上面语句会发生错误,用delimiter $

--将边界符改为$ 这样就不会发生冲突

--同一个表在同一时间同意动作不能有不同的触发器

--查看已有的触发器 show triggers;

--删除指定的触发器 drop trigger 触发器名字;

--建表语句

create table goods(

goods_id int not null,

goods_name varchar(30) not null default '',

goods_num int

)engine myisam charset utf8;

--插入数据

insert into goods values (1,'cat',32),(2,'dog',42),(3,'rab',43);

--创建订单表

create table ord(

id int not null,

goods_id int not null,

num int not null default 0

)engine myisam charset utf8;

--更改边界,最后不需要分号;

delimiter $

--创建触发器,当ord表插入一条数据(1,1,1)时 商品cat数量减1

create trigger trig1

after

insert

on ord

for each row

begin

update goods set goods_num=goods_num-1 where goods_id=1;

end$

--然后插入一条数据

insert into ord values (1,1,1)$

--goods表确实减少了1,但是这个触发器不具有通用性,

--不管买几个商品和买多少商品,总是cat商品减1

drop trigger trig1$

--旧的一行数据对象old,新的一条数据对象new

create trigger trig2

after

insert

on ord

for each row

begin

update goods set goods_num=goods_num-new.num where goods_id=new.goods_id;

end$

--这个触发器具有通用性

--监控delete语句,当删除订单时,需要再把商品加回来

create trigger trig3

after

delete

on ord

for each row

begin

update goods set goods_num=goods_num+old.num where goods_id=old.goods_id;

end$

--监控update语句,当更新表时,产生相应的操作,在不修改商品类型的情况

create trigger trig4

after

update

on ord

for each row

begin

update goods set goods_num=goods_num+old.num-new.num where goods_id=new.goods_id;

end$

--在这种情况下,会出现爆仓的情况,因为更新的数据可能超过商品的库存量

drop trigger trig4$

create trigger trig4

before

update

on ord

for each row

begin

declare gnum int;

select goods_num into gnum from goods where goods_id=new.goods_id;

if (new.num-old.num)>gnum then

set new.num=gnum+old.num;

end if;

update goods set goods_num=goods_num+old.num-new.num where goods_id=new.goods_id;

end$

--insert也会出现这种情况,也要更改一下

drop trigger trig2$

create trigger trig2

before

insert

on ord

for each row

begin

declare gnum int ;

select goods_num into gnum from goods where goods_id=new.goods_id;

if new.num>gnum then

set new.num=gnum;

end if;

update goods set goods_num=goods_num-new.num where goods_id=new.goods_id;

end$

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 MySQL 触发器调用 Python 脚本,你可以使用以下步骤: 1. 在 MySQL 创建一个触发器,以便在特定事件发生时触发执行 Python 脚本。 2. 在 Python 编写脚本,以便执行所需的操作。你可以使用 Python 的 MySQL 连接(如 PyMySQL)与 MySQL 进行交互。 3. 在触发器调用 Python 脚本,可以通过 shell 命令调用 Python 解释器来实现。例如,在 Linux 系统上,你可以使用以下命令: ``` `/usr/bin/python /path/to/your/python/script.py` ``` 4. 将该命令作为 MySQL 触发器的 shell 命令调用即可。 需要注意的是,如果你的 Python 脚本需要接收参数,你需要在触发器将这些参数传递给 shell 命令。可以使用 MySQL 的 `CONCAT()` 函数将参数拼接成字符串,然后在 shell 命令解析这个字符串。 示例代码如下: ```mysql CREATE TRIGGER `my_trigger` AFTER INSERT ON `my_table` FOR EACH ROW BEGIN SET @args = CONCAT('arg1', ' ', 'arg2', ' ', NEW.`column`); SET @cmd = CONCAT('/usr/bin/python /path/to/your/python/script.py', ' ', @args); SET @result = sys_exec(@cmd); END; ``` 在这个示例,我们创建了一个名为 `my_trigger` 的触发器,它会在 `my_table` 表插入新行后触发。在触发器,我们使用 `CONCAT()` 函数将三个参数拼接成字符串,并将其存储在变量 `@args` 。然后,我们使用 `CONCAT()` 函数将 Python 解释器路径和脚本路径与 `@args` 拼接起来,存储在变量 `@cmd` 。最后,我们调用 MySQL 的 `sys_exec()` 函数来执行 shell 命令并将结果存储在变量 `@result`

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值