0

使用 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};
4

2 回答 2

0

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

FOR EACH ROW

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

于 2013-10-17T15:52:21.297 回答
0

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

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

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

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

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

于 2013-10-17T18:18:59.900 回答