~~语法~~
CREATE TRIGGER <触发器名称> --触发器必须有名字,最多64个字符,可能后面会附有分隔符.它和MySQL中其他对象的命名方式基本相象.
{ BEFORE | AFTER } --触发器有执行的时间设置:可以设置为事件发生前或后。
{ INSERT | UPDATE | DELETE } --同样也能设定触发的事件:它们可以在执行insert、update或delete的过程中触发。
ON <表名称> --触发器是属于某一个表的:当在这个表上执行插入、 更新或删除操作的时候就导致触发器的激活. 我们不能给同一张表的同一个事件安排两个触发器。
FOR EACH ROW --触发器的执行间隔:FOR EACH ROW子句通知触发器 每隔一行执行一次动作,而不是对整个表执行一次。
<触发器SQL语句> --触发器包含所要触发的SQL语句:这里的语句可以是任何合法的语句, 包括复合语句,但是这里的语句受的限制和函数的一样。
顾名思义,new是新插入的数据,old是原来的数据
insert只会有new,代表着要插入的新记录
delete只会有old,代表着要删除的记录
update由于执行的是先删除旧的记录,再插入新的记录,因此new和old都会有,且含义与上面的相同
根据ID做一个hash路由算法分配服务器
触发器更新本表
Can’t update table ‘tbl’ in stored function/trigger because it is already used by statement which invoked this stored function/trigger 错误,
如果你在触发器里面对刚刚插入的数据进行了insert/update, 则出现这个问题。因为会造成循环的调用.
应该使用set操作,而不是在触发器里使用update,比如
Drop trigger route ;//删除触发器
delimiter $(意思是告诉mysql语句的结尾换成以$结束)
delimiter $
create trigger route
before insert on arcticle_link
for each row
BEGIN
set NEW.server_id=(floor(rand()*100)+1);
END$
rand的范围0 <= rand() < 1.0
error---Updating of NEW row is not allowed in after trigger
对new赋值的时候只能在触发器before中只用,在after中是不能使用的,比如
在after的触发器中,new的赋值已经结束了,只能读取内容。 如果使用after不能使用new赋值,只能取值
new在before触发器中赋值,取值;在after触发器中取值