触发器是与表有关的数据库对象,触发器只能是针对创建的永久表,而不能是临时表。

一、创建触发器

触发器是与表有关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合

1.1 创建触发器

触发器是与表有关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合。可以协助应用在数据库端确保数据的完整性。

创建触发器

创建触发器的语法如下:

create trigger trigger_name
trigger_time trigger_event on tbl_name 
FOR EACH ROW 
trigger_stmt

注意:触发器只能创建在永久表(Permanent
Table)上,不能对临时表(Temporary Table)创建触发器

其中 trigger_time 是触发器的触发时间,可以是 before 或者 after,before
的含义指在检查约束前触发,而 after 是在检查约束后触发

trigger_event 就是触发器的触发事件,可以是 insert,update 或者
delete

对同一个表相同触发时间的相同触发事件,只能定义一个触发器

使用别名 oldnew 来引用触发器中发生变化的记录内容

 -- 语法:
CREATE TRIGGER trigger_name trigger_time trigger_event
ON tbl_name FOR EACH ROW trigger_stmt

表中的某些数据改变,同时引起其他相关数据改变时,使用触发器,是一类特殊的事务,可以监视某种数据操作(insert、update、delete),并触发相关操作(insert、update、delete);sql
1 触发 sql n

删除触发器

一次可以删除一个触发程序,如果没有指定
schema_name,默认为当前数据库,具体语法如下:

drop trigger [schema_name.]trigger_name

  trigger_time:是触发器的触发时间,可以是 before或after,
before是检查约束前触发,而after是检查约束后触发。
  trigger_event:是触发器的触发事件,可以是 insert,update,delete。
  同一个表相同的触发时间的相同触发事件,只能定义一个触发器。使用别名old和new
来引用触发器中发生变化的记录内容。

触发器只能创建在永久表上,不能对临时表创建触发器。

查看触发器

可以通过执行 show triggers 命令查看触发器的状态,语法等信息

另外一个查看方式是查询系统表的 information_schema.triggers

--  先查看city_memory数据(触发前查看表数据)
SELECT * FROM city_memory;

触发器不仅可以简化程序,还可以增加程序的灵活性。

触发器的使用

触发器执行的语句有以下两个限制

  • 触发程序不能调用将数据返回客户端的存储程序,也不能使用采用 call
    语句的动态
    SQL语句,但是允许存储程序通过参数将数据返回触发程序。也就是存储过程或者函数通过
    out 或者 inout
    类型的参数将数据返回触发器是可以的,但是不能调用直接返回数据的过程
  • 不能在触发器中使用以显式或隐式方式开始或结束事务的语句,如 start
    transaction,commit 或 rollback

MySQL 的触发器是按照 before 触发器,行操作,after
触发器的顺序执行的,其中任何一步操作发生错误都不会继续执行剩下的操作。如果是对事务表进行的操作,那么会整个作为一个事务被回滚(Rollback),但是如果是对非事务表进行的操作,那么已经更新的记录将无法回滚,这也是设计触发器的时候需要注意的问题

图片 1

语法四要点:

-- 创建city表的insert 触发器 使用AFTER触发时间
DELIMITER $$
CREATE TRIGGER  tri_city
 AFTER INSERT ON city FOR EACH ROW BEGIN
INSERT INTO city_memory (country_id, cityname, Citycode)
VALUES (new.country_id, new.cityname, new.Citycode);     
END;
$$
DELIMITER ;

-- 插入city表数据,触发city表插入触发器
INSERT INTO  city(country_id, cityname, Citycode) VALUES(2,'中国触发','001触发');

-- 再次查看SELECT * FROM city_memory;

监视地点

图片 2

监视事件(insert、update、delete)

  下面是city表

触发时间(after、before)

图片 3

触发事件(insert、update、delete)

2. 查看触发器

图片 4

-- 使用information_schema.triggers来查看
SELECT * FROM information_schema.triggers WHERE trigger_name = 'tri_city'

CREATE TRIGGER trigger_name

图片 5

  trigger_time

  1. 删除触发器

    DROP TRIGGER tri_city;

  trigger_event

 总结:触发器的限制:

  ON tbl_name

(1)触发程序不能调用将数据返回客户端的存储程序。

  For Each Row

(2)不能在触发器中使用以显式或隐式方式开始或结束事务的语句。

  trigger_stmt

编写过于复杂的触发器或者增加过多的触发器对记录的插入、更新、删除操作肯定会有比较严重的影响。不要将应用的处理逻辑过多的依赖于触发器来处理。

说明:触发器只能创建在永久表上

 

Trigger_time 触发器的触发时间 before 或 after

Trigger_event 触发事件 insert、update 或 delete

Trigger_stmt begin。。。end

使用别名old和new来引用触发器中发生变化的记录内容;

对于同一表相同触发时间相同触发事件只能定义一个触发器

图片 6

图片 7

图片 8

图片 9

问题:如何让 update 中的 goods_number、goods_id 根据 insert
的数据实时变化?

通过 new 关键字,同理监听删除 用关键字 old

Insert 无中生有为 new

图片 10

Delete 从有到无为 old

图片 11

Update 由 旧 变为 新 旧数据用 ord,新数据 new

图片 12

函数加变量定义以及 before 和 after 的区别:

图片 13

For each row 的含义:

图片 14

二、删除触发器

一次可以删除一个触发程序;

DROP TRIGGER trigger_name;

查看触发器

SHOW TRIGGERS;

Information.Triggers表

Select * from triggers where trigger_name =”name”;

三、触发器的使用

不能再触发器中使用以显示或隐式方式开启或结束事务语句;

不能调用将数据返回客户端的存储程序,也不能使用采用call语句的动态sql语句

相关文章