笔记-8:mysql触发器

1.触发器介绍

  • 触发器是一个被指定关联到一个表的数据库对象,当对一个表的特定事件出现时,将会被激活。
  • mysqk触发器只支持:INSERT、UPDATE、DELETE语句。
  • 每个表每个事件每次只允许一个触发器,因此,每个表最多支持6个触发器。

2.创建触发器

create 
            TRIGGER trigger_name trigger_time trigger_event
            ON tb_name FOR EACH ROW trigger_body

# trigger_name:触发器名称。
# trigger_time:触发器被触发的时该。即使用DEFORE、AFTER用于表示触发器是在激活它的语句之前或者之后触发。如果希望验证新数据是否满足使用的限制,则使用BEFORE;如果希望在激活触发器的语句执行之后完成几个或更多的改变,通过使用AFTER。
# trigger_event:触发事件,用于指定激活触发器的语句的种类。(INSERTUPDATEDELETE)。
# tb_name:与触发器相关联的表名。
# FOR EACH ROW:指定对于受触发事件影响的每一行都要激活触发器的动作。
# trigger_body:触发器动作主体,包含触发器激活时将要执行的mysql语句。
# 在表tb_student中创建一个触发器tb_student_insert_trigger,用于每次向表tb_student中插入一行数据时将学生变量str的值设置为”on student added!“
create trigger tb_student_insert_trigger after insert on tb_student FOR EACH ROW SET @ str='on student added!';

insert into tb_student values('2013110101','张晓勇','','1997-12-11','山西','','AC1301');

select @ str;            # 验证触发器

3.查看触发器

SHOW TRIGGERS [{FROM | IN} db_name]

4.删除触发器

DROP TRIGGER [IF EXISTS] trigger_name
删除tb_student表的触发器tb_student_insert_trigger
drop trigger if exists tb_student_trigger;
  • 当删除表时,会自动删除该表相关联的触发器。
  • 触发器不能更新与覆盖,如果需要修改触发器,必须先删除,然后再创建。

5.使用触发器

 5.1 INSERT触发器

insert触发器可以在insert语句执行之前或之后执行。需要注意的点:

  • 在insert触发器代码内可引用一个NEW的虚拟表来访问被插入的行。
  • 在before insert触发器中,NEW中的值也可以被更新,即允许更改被插入的值。
  • 在AUTO_INCREMENT列,NEW在insert执行之前是0,在insert执行之后将。
# 在表tb_student中重新创建触发器tb_student_insert_trigger,用于每次向表tb_student中插入一行数据时将学生变量str的值设置为新插入学生的学号。
create trigger tb_student_insert_trigger AFTER INSERT on tb_student FOR EACH ROW SET @ str=NEW.studentNo;

5.2 DELETE触发器

DELETE触发器可以在DELETE语句执行之前或之后执行。需要注意的点:

  • 在DELETE触发器代码内可以引用一个名为OLD的虚拟表来访问被删除的行。
  • OLD中的值全部是只读,不能被更新。

5.3 UPDATE触发器

 UPDATE触发器在UPDATE语句执行之前或之后执行。需要注意的点:

  • 在UPDATE触发器代码内可以引用一个名为OLD的虚拟表访问以前的值,也可以引用一个名为NEW的虚拟表访问新更新的值。
  • 在BEFORE UPDATE触发器中,NEW中的值可能也被更新,即允许更改将要用于UPDATE语句中的值。
  • OLD中的值全部是只读的,不能被更新。
  • 当触发器涉及对表自身的更新操作时,只能使用BEFORE UPDATE触发器,不能使用AFTER UPDATE触发器。
# 在表tb_student中创建一个触发器tb_student_update_trigger,用于每次更新tb_student时将该表中nation列的值设置为native列的值。
create trigger tb_student_update_trigger BEFORE UPDATE ON tb_student FOR EACH ROW SET NEW.nation=OLD.native;

update tb_student SET nation='' where studentName='张晓勇';

猜你喜欢

转载自www.cnblogs.com/Cyzhouke/p/11490407.html
今日推荐