1.创建触发器
CREATE TRIGGER trigger_name
trigger_time
trigger_event ON tb_name
FOR EACH ROW
trigger_stmt
解释:
trigger_name:标识触发器名称,用户自行指定;
trigger_time: 标识触发时机,值为BEFORE或者AFTER;
trigger_event: 标识触发事件,值为INSERT,UPDATE,DELETE;
tb_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 语句触发。
2.查询所有触发器
show TRIGGERS;
3.删除触发器:
DROP TRIGGER double_salary;
4.注意事项
内部变量值,不能和select查询的值相同,否则会有问题。
5.游标操作(循环操作),下面是一个简单的例子
DROP TRIGGER IF EXISTS update_data;
DELIMITER $
CREATE TRIGGER update_data
AFTER
UPDATE ON table_name(你的表名)
FOR EACH ROW
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE ids INT;
DECLARE sem_num_id,text_nums INT DEFAULT 0;
DECLARE cur1 CURSOR FOR SELECT id FROM table_names; # 创建一个游标并且将查询的数据赋值给他
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; # 用于跳出for循环
OPEN cur1; # 打开游标
REPEAT # 循环数据
FETCH cur1 INTO ids; #定义循环的值
IF NOT done THEN
# 这里是做一些循环之后的操作
insert into .....
END IF;
UNTIL done END REPEAT;
CLOSE cur1; # 关闭游标
END $
DELIMITER;
6.bit操作
如果你存储的值为bit类型,需要位移才能找出哪个为真
Id_maps &(1 << ids) > 0;
Id_maps:bitmap字段,ids:位移的数字,如1,2,3,4
如果Id_maps &(1 << ids) <=0;表示这个ids在map中为false。
7.错误定位
当触发器报错为:“There is no NEW row in on DELETE trigger”
因为在删除的时候不会出现NEW.id,如果使用了就会报错,全部改为OLD.id就没有问题了。
原文:https://www.cnblogs.com/coding8832/p/14475190.html