三种类型的触发器

本文介绍了如何在SQL中创建并应用三种类型的触发器:插入(insert)触发器、更新(update)触发器及删除(delete)触发器。通过示例展示了如何在进行数据操作时同步更新多个相关表,确保数据的一致性和完整性。

 /* 建三个表分别为
stu.info : stu_id int ,stu_nam char(10) ,stu_tel char(10)
stu_e : stu_id int,stu_hei char(10),sex bit
stu_cj : stu_id int,stu_cj float
*/
--触发器 insert
if exists(select * from sysobjects where name='T_test1')
begin
 drop Trigger T_test1
end
go
 create Trigger T_test1 on stu_info
for insert
as

declare  @stu_id int,
  @stu_nam char
select
 @stu_id =stu_id,
 @stu_nam =stu_nam
from inserted
 

begin transaction

if not exists (select * from stu_e where stu_id=@stu_id)
begin
 insert stu_e values(@stu_id,'178',1)
end

if not exists (select * from stu_cj where stu_id=@stu_id)
begin
 insert stu_cj values(@stu_id,56.00)
end
commit transaction

insert stu_info values(2,'bb','2222222')

select * from stu_info
select * from stu_e
select * from stu_cj
--------------------------------------------------------------------
--触发器update
if exists(select * from sysobjects where name='T_test2')
begin
 drop Trigger T_test2
end
go
 create Trigger T_test2 on stu_info
for update
as

begin transaction
if update(stu_id)
 begin
 update stu_e set stu_id = i.stu_id
 from stu_e e,deleted d,inserted i
 where e.stu_id = d.stu_id
 end
 begin
 update stu_cj set stu_id = i.stu_id
 from stu_e c,deleted d,inserted i
 where c.stu_id = d.stu_id
 end
commit transaction
---
update stu_info set stu_id =2 from stu_info where stu_id=4
select * from stu_info
select * from stu_e
select * from stu_cj

---------------------------------------------------------------------------
--触发器delete

if exists(select * from sysobjects where name='T_test3')
begin
 drop Trigger T_test3
end
go
 create Trigger T_test3 on stu_info
for delete
as

declare  @stu_id int,
  @stu_nam char
select
 @stu_id =stu_id,
 @stu_nam =stu_nam
from deleted
begin transaction
if exists(select * from stu_e where stu_id=@stu_id)
begin
  Delete stu_e
         From stu_e e , deleted d
         Where e.stu_id=d.stu_id
end
if exists(select * from stu_cj where stu_id=@stu_id)
begin
  Delete stu_cj
         From stu_cj c , deleted d
         Where c.stu_id=d.stu_id
end
commit transaction

delete stu_info where stu_id=2

select * from stu_info
select * from stu_e
select * from stu_cj

### MySQL 中触发器的执行顺序 在 MySQL 数据库中,触发器可以在 `INSERT`、`UPDATE` 和 `DELETE` 操作之前 (`BEFORE`) 或之后 (`AFTER`) 自动执行特定的操作。具体到这三种操作类型触发器及其执行顺序如下: 对于单条记录的操作,在同一时刻可以有多个触发器被激活,这些触发器按照定义的时间点(即 `BEFORE` 或者 `AFTER`)以及事件类型来决定具体的执行次序。 - **插入 (INSERT)**: - 如果存在 `BEFORE INSERT` 触发器,则会在新行实际写入表前先运行该触发器逻辑[^1]。 - 接着才是真正的数据插入动作发生。 - 若配置了 `AFTER INSERT` 触发器,则会在此刻启动并处理任何必要的后续任务。 - **更新 (UPDATE)**: - 类似于插入过程中的 `BEFORE UPDATE` 触发器将在更改现有行的数据之前被执行。 - 随后进行的是目标字段的实际修改工作。 - 而 `AFTER UPDATE` 触发器则是在所有列值已被改变后的阶段发挥作用。 - **删除 (DELETE)**: - 当设置了 `BEFORE DELETE` 的时候,它会在物理上移除某一行之前先行调用相应的触发程序。 - 实际上的删除行为紧随其后完成。 - 对应地,如果有 `AFTER DELETE` 触发器的话,那么这条指令将会作为最后一步得到响应。 需要注意的是,同一个时间点下针对同一种 DML 操作的不同触发器之间并没有固定的先后关系;也就是说,如果同时拥有两个以上的相同类别触发器(比如都是 `BEFORE INSERT`),它们之间的相对位置取决于创建时所指定的名字排序或者是数据库管理系统内部实现机制的影响[^2]。 ```sql DELIMITER // CREATE TRIGGER before_insert_example BEFORE INSERT ON my_table FOR EACH ROW BEGIN -- 这里放置一些预处理代码... END;// DELIMITER ; DELIMITER // CREATE TRIGGER after_update_example AFTER UPDATE ON another_table FOR EACH ROW BEGIN -- 更新完成后要做的额外事情... END;// DELIMITER ; ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值