文章目录
insert
,update
,delete
语句,如果定义了触发程序,当数据执行这些语句的时候就会激发触发器执行相应的操作。create trigger trigger_name trigger_time trigger_event on table for each row trigger_stmt
trigger_name
:触发器的名字trigger_time
: 触发器触发的时机,取值为before
,after
before
:表示在激发触发器的语句执行之前执行触发器的执行语句after
:表示在激发触发器的语句执行之后执行触发器的执行语句trigger_event
:触发事件,取值为insert
,update
,delete
insert
:比如Mysql中的insert
和replace
语句就会触发这个事件update
:更新某一行的数据会激发这个事件,比如update
语句delete
:删除某一行的时候激发触发器,可能通过delete
或者replace
语句激发table
:标识建立触发器的表名,即是当那张表发生了insert
,update
,delete
事件激发触发器trigger_stmt
:触发器执行的语句new.age
:获取新插入的字段age
的值new.name
: 获取新插入的name
字段的值-- 创建user表
create table user(id int primary key auto_increment,name varchar(10),age int);
-- 设置用户变量@sum,用于统计年龄
set @sum=0;
-- 插入数据,将会在插入数据之前激发触发器,执行触发器中定义的语句,计算出插入的年龄总和赋值给@sum
insert into user(name,age) values("Jack",22),("Tom",33);
-- 创建触发器,insert事件,在user表插入数据之前执行语句,其中的new.age是获取插入的每一行的age字段的值
create trigger sum before insert on user for each row set @sum=@sum+new.age;
delimiter //
create trigger trigger_name trigger_time trigger_event on table for each row
begin
-- 语句执行列表
end
//
delimiter ;
before
的触发时间new.name
: 表示修改之后的name
字段的值,如果没有修改,那么和之前的一样old.name
:表示修改之前的name
字段的值-- 创建user表
create table user(id int primary key auto_increment,name varchar(10),age int);
-- 创建触发器
delimiter //
create trigger testUpdate before update on user for each row
begin
declare total int default 0; -- 创建一个total变量,统计数量
select count(*) from user where name=new.name into total; -- 根据修改之后的name查询出数量赋值给total
if old.name!=new.name&&total!=0 -- count!=0并且确实修改了名字表示修改的名字重复
then set new.id=1; -- 名字重复导致主键冲突抛出异常,这样后续的语句就不会执行了
end if;
end
//
delimiter ;
show triggers [from database]
: 查看当前数据的所有的触发器 show triggers from test \G
: 查看test
数据库中的所有触发器show triggers \G
: 有条理的显示所有触发器information_schema
数据库中的triggers
表中查询指定的触发器select * from information_schema.triggers where trigger_name="testUpdate"\G
where
后面是条件drop db.trigger_name
: 删除指定数据库中的触发器db
:数据库的名字trigger_name
:触发器的名字InnoDB
数据库,其上建立的表是事务性表,也就是事务安全的。这时,若SQL语句或触发器执行失败,MySQL 会回滚事务,有:INSERT
型触发器中,NEW
用来表示将要(BEFORE
)或已经(AFTER
)插入的新数据;UPDATE
型触发器中,OLD
用来表示将要或已经被修改的原数据,NEW
用来表示将要或已经修改为的新数据;DELETE
型触发器中,OLD
用来表示将要或已经被删除的原数据;NEW/OLD.columName
: 比如获取更新后的name
字段的值new.name
OLD
是只读的,不可以使用set
修改new
是可以修改的,我们可以在触发器中使用set
语句修改