Mysql使用触发器删除插入

Mysql使用触发器删除插入,mysql,triggers,Mysql,Triggers,使用mysql 5.6。我有两张桌子。其中一个有一个哈希白名单。当我在另一个表中插入新行时,我想首先将insert语句中的哈希值与白名单进行比较。如果它在白名单中,我不想在以后插入更少的数据。插入是从另一个程序生成的,是包含sql语句的文本文件 我一直在玩触发器,它几乎可以工作了: CREATE TRIGGER `Filelist` BEFORE INSERT ON `filelist` FOR EACH ROW BEGIN IF( SELECT count( md5hash ) FROM wh

使用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列,然后在导入后基于该列进行质量下降之外,还有什么方法可以实现我的目标吗?我对此也有问题[忽略是一个小问题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};

我想你是在做某种插入式触发。 您需要将以下语句添加到触发器中,以使其按需要工作:

FOR EACH ROW

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

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

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

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

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

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

这不是问题所在。OP只显示触发器的相关部分。正如我所读到的,问题是如果一行已经在白名单表中,它会跳过整个行集-这是OP想要避免的。如果我误解了,可能需要对问题进行一些澄清。西蒙对上述问题评论的解释是正确的。遗憾的是,答案并非如此。我通过phpmyadmin创建了这个触发器。Mysql插入不支持where子句,所以这不起作用。这是个好主意。在我研究触发器之前,我想太多伟人的想法太相似了,因为对where子句缺乏支持。你真的尝试过这个查询吗?我用MySQL 5.6测试了它是的。它给了我一个语法错误。我的声明是:INSERT INTO fileaudit.filelist rsTime、CName、OS、Path、FileName、Hash值'20131010121919','HOU1287','WIN_7','C:\\Windows\\SysWOW64\','cscript.exe','3d58143149fbe29c3a43baf14277c6b2'不存在的地方从白名单中选择md5hash,其中md5hash='3d58143149fbe29c3a43baf14277c6b2';散列在白名单中。错误为1064,靠近“WHERE NOT exists”从白名单中选择md5hash,其中md5hash='3d58143149fbe29c'位于第1行,这与我的示例不同。那是插页。。。值和我的代码是一个插入。。。SELECT语句。更改select语句的值列表双表很神奇。我认为正确的代码应该插入文件列表rsTime、CName、OS、Path、FileName、哈希选择'20131010121919'、'HOU1287'、'WIN_7'、'C:\\Windows\\SysWOW64\'、'cscript.exe',来自DUAL的“3d58143149fbe29c3a43baf14277c6b2”,其中不存在md5hash=“3d58143149fbe29c3a43baf14277c6b2”从白名单中选择md5hash;如果这是可能的,我不知道怎么做。对于任何阅读本文的人,我都通过在插入完成后运行delete来解决这个问题,以删除白名单中具有匹配哈希的任何行。我使用的查询是:delete from filelist,其中select countmd5hash from whitelist,其中md5hash=hash>0我将继续关注这个问题,以防我得到一个有效的答案。