Mysql删除带有触发器的插入

时间:2013-10-17 15:49:28

标签: mysql triggers

使用mysql 5.6。我有两张桌子。一个人有哈希的白名单。当我在另一个表中插入一个新行时,我想首先将insert语句中的哈希值与白名单进行比较。如果它在白名单中,我不想进行插入(较少的数据可以在以后进行)。插入是从另一个程序生成的,是带有sql语句的文本文件。

我一直在玩触发器,几乎让它起作用了:

CREATE TRIGGER `Filelist` BEFORE INSERT ON `filelist`
FOR EACH ROW BEGIN IF(
SELECT count( md5hash ) FROM whitelist WHERE md5hash = new.hash ) >0
THEN
  SIGNAL SQLSTATE '45000'
  SET MESSAGE_TEXT = 'Can not have duplicates';

END IF ;

END 

但是有一个问题。抛出错误的信号会停止导入。我想跳过这一行,而不是停止整个导入。

有些搜索没有找到任何方法可以默默跳过导入。

我的下一个想法是创建一个重复的表定义,并将插入重定向到该dup表。但旧的和新的似乎不适用于表名。

然后在我的表中添加一个ignore列,然后在导入后根据该列进行质量下降,有没有办法实现我的目标?我也有这个问题[忽略是一个tinyint(1)]:

DELIMITER $$

CREATE TRIGGER whitelisted
BEFORE INSERT ON filelist
FOR EACH ROW BEGIN
  IF (select count(md5hash) from whitelist where md5hash=new.hash) > 0 THEN
  SET Ignore = true;
  END IF;
END$$
/* This is now "END$$" not "END;" */

/* Reset the delimiter back to ";" */
DELIMITER ;

#1064 - You have an error in your SQL syntax; check the manual that corresponds to
your MySQL server version for the right syntax to use near ') THEN SET Ignore = true;
END IF; END' at line 4

有什么建议吗?我也试过了

SET Ignore = 1;
SET Ignore = '1';
SET new.Ignore = {all of the above};

2 个答案:

答案 0 :(得分:0)

我认为你正在做某种ON INSERT触发器。 您需要将以下语句添加到触发器中,以使其按预期工作:

FOR EACH ROW

这将使触发器在每一行上执行一次。

答案 1 :(得分:0)

我不确定我是否遵循此规范:

  

我有两张桌子。一个人有哈希的白名单。当我在另一个表中插入一个新行时,我想首先将insert语句中的哈希值与白名单进行比较。如果它在白名单中,我不想进行插入

我的第一次尝试是这样的:

INSERT INTO filelist (filename, hash)
SELECT "myfile", "ABCD" FROM DUAL
WHERE NOT EXISTS(
    SELECT md5hash FROM whitelist where md5hash = "ABCD"    
);

除非您的要求中缺少详细信息,否则我认为您根本不需要触发器。