MySQL注解器个人理解和使用
想要实现一个功能,防止重复文件上传。
我研究了一下,这个功能应该是用不了触发器的。
因为有三种事件能够触发触发器:INSERT、UPDATE和DELETE。
- 其中在触发程序体里面可以用new和old来指定变量。
- insert型触发器:new表示将要或者已经插入的新数据,无old。
- update型触发器:new表示将要或者已经修改的新数据,old表示将要或者被修改的原数据。
- delete型触发器:old表示将要或者已经被删除的原数据,无new。所以只有用update。
还有一个限制就是,在哪张表上建立触发器,这个表就不能在之后去操作它了 。所以必须得有一个temp表,在temp表上建立触发器,刺激触发器后启用其中的程序体。
否则,如下面这段代码,在att_table
上建立触发器,又在BEGIN和END
中间的程序体中操作表att_table
CREATE TRIGGER `att_table_AFTER_UPDATE`
AFTER UPDATE ON `att_table`
FOR EACH ROW
BEGIN
IF (NEW.attTime not in (select old.attTime from att_table where new.uId=old.uId)) THEN
insert into att_table(uId,attTime) values(new.uId,new.attTime);
END IF;
END
那么就会报错:
Error Code: 1442. Can't update table 'att_table' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
综合以上,我写了一个这样的触发器。
· att_table
是最后在系统中调用的签到表,存储的是所有的签到信息。
· temp_table
是那个建立触发器的表,存储的是当前上传文件中的签到信息。
CREATE TRIGGER `att_table_AFTER_UPDATE`
AFTER UPDATE ON `temp_table` FOR EACH ROW BEGIN
IF (NEW.temp_attTime not in (select old.temp_attTime from temp_table where new.temp_uId=old.temp_uId)) THEN
insert into att_table(uId,attTime) values(new.uId,new.attTime);
END IF;
END
但是这样有个不好的地方就是,因为选择了UPDATE,所以上传文件的数据条数就受到了限制。而且,只能判断本次文件上传和上次文件上传是否是重复的。
鸣谢:
旭神! 谢谢把我领上道儿的旭神!
网友评论