mysql 触发器

  • MySQL包含对触发器的支持。
  • 触发器是一种与表操作有关的数据库对象,当触发器所在表上出现指定事件时,将调用该对象,即表的操作事件触发表上的触发器的执行。
  • 为什么使用触发器
    • 在学生表中拥有字段学生姓名,字段学生总数,每当添加一条学生信息时,学生的总数就必须同时更改。
    • 在学生表中还会有学生姓名的缩写,学生住址等字段,添加学生信息时,往往需要检查电话、邮箱等格式是否正确。
    • 上面的例子使用触发器完成时具有这样的特点,需要在表发生改变时,自动进行一些处理。mysql在触发DELETE/UPDATE/INSERT语句时就会自动执行所设置的操作,其他SQL语句则不会激活触发器。
  • 创建触发器
    • 在MySQL中,创建触发器语法如下:
    • 代码如下:
      • CREATE TRIGGER trigger_name
      • trigger_time
      • trigger_event ON tbl_name
      • FOR EACH ROW
      • trigger_stmt
    • 其中:
    • trigger_name:标识触发器名称,用户自行指定;
    • trigger_time:标识触发时机,取值为 BEFORE 或 AFTER;
    • trigger_event:标识触发事件,取值为 INSERT、UPDATE 或 DELETE;
    • tbl_name:标识建立触发器的表名,即在哪张表上建立触发器;
    • trigger_stmt:触发器程序体,可以是一句SQL语句,或者用 BEGIN 和 END 包含的多条语句。
    • 由此可见,可以建立6种触发器,即:BEFORE INSERT、BEFORE UPDATE、BEFORE DELETE、AFTER INSERT、AFTER UPDATE、AFTER DELETE。
    • 另外有一个限制是不能同时在一个表上建立2个相同类型的触发器,因此在一个表上最多建立6个触发器。
    • trigger_event 详解
      • MySQL 除了对 INSERT、UPDATE、DELETE 基本操作进行定义外,还定义了 LOAD DATA 和 REPLACE 语句,这两种语句也能引起上述6中类型的触发器的触发。
      • LOAD DATA 语句用于将一个文件装入到一个数据表中,相当与一系列的 INSERT 操作。
      • REPLACE 语句一般来说和 INSERT 语句很像,只是在表中有 primary key 或 unique 索引时,如果插入的数据和原来 primary key 或 unique 索引一致时,会先删除原来的数据,然后增加一条新数据,也就是说,一条 REPLACE 语句有时候等价于一条。
      • INSERT 语句,有时候等价于一条 DELETE 语句加上一条 INSERT 语句。
      • INSERT 型触发器:插入某一行时激活触发器,可能通过 INSERT、LOAD DATA、REPLACE 语句触发;
      • UPDATE 型触发器:更改某一行时激活触发器,可能通过 UPDATE 语句触发;
      • DELETE 型触发器:删除某一行时激活触发器,可能通过 DELETE、REPLACE 语句触发。
  • 查看触发器
    • 和查看数据库(show databases;)查看表格(show tables;)一样,查看触发器的语法如下:
    • SHOW TRIGGERS [FROM schema_name];
    • 其中,schema_name 即 Schema 的名称,在 MySQL 中 Schema 和 Database 是一样的,也就是说,可以指定数据库名,这样就
    • 不必先“USE database_name;”了。
  • 删除触发器
    • 和删除数据库、删除表格一样,删除触发器的语法如下:
    • DROP TRIGGER [IF EXISTS] [schema_name.]trigger_name
  • 触发器的执行顺序
    • 我们建立的数据库一般都是 InnoDB 数据库,其上建立的表是事务性表,也就是事务安全的。这时,若SQL语句或触发器执行失败,MySQL 会回滚事务,有:
      • ①如果 BEFORE 触发器执行失败,SQL 无法正确执行。
      • ②SQL 执行失败时,AFTER 型触发器不会触发。
      • ③AFTER 类型的触发器执行失败,SQL 会回滚
  • 触发器的使用限制
    • 触发器只能创建在永久表上
    • 触发器不能使用CALL语句调用具有返回值或使用了动态SQL的存储过程
    • 触发器中不能使用开启或结束事务的语句段
    • 外键不会激活触发器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值