美文网首页
MySQL注解器的一些个人理解

MySQL注解器的一些个人理解

作者: NnnLillian | 来源:发表于2018-08-06 10:18 被阅读15次

    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,所以上传文件的数据条数就受到了限制。而且,只能判断本次文件上传和上次文件上传是否是重复的。

    鸣谢:
    旭神! 谢谢把我领上道儿的旭神!

    相关文章

      网友评论

          本文标题:MySQL注解器的一些个人理解

          本文链接:https://www.haomeiwen.com/subject/rsjwvftx.html