使用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};
答案 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"
);
除非您的要求中缺少详细信息,否则我认为您根本不需要触发器。