使用 mysql 5.6。我有两张桌子。一个有一个哈希白名单。当我在另一个表中插入新行时,我想首先将插入语句中的哈希与白名单进行比较。如果它在白名单中,我不想进行插入(稍后需要挖掘的数据更少)。插入是从另一个程序生成的,是带有 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 表。但是新旧似乎不适用于表名。
除了在我的表中添加一个忽略列然后在导入后基于该列进行大量删除之外,有什么方法可以实现我的目标吗?我也有这个问题[忽略是一个 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};