2013-10-17 36 views
0

使用MySQL 5.6。我有兩張桌子。一個有一個哈希的白名單。當我向另一個表中插入新行時,我想首先將插入語句中的散列與白名單進行比較。如果它在白名單中,我不想執行插入操作(稍後要處理的數據較少)。插入是從另一個程序生成的,並且是帶有sql語句的文本文件。Mysql使用觸發器刪除插入內容

我一直在玩的觸發器,幾乎有工作:

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}; 
+0

如果這是可能的,我不知道如何。對於閱讀本文的任何人,我都會在插入完成後運行刪除操作來解決問題,以刪除白名單中包含匹配哈希的任何行。我使用的查詢是:從filelist中刪除其中(從白名單中選擇計數(md5hash),其中md5hash =散列)> 0我會繼續觀察此情況,以便我得到有效的答案。 – user2891127

回答

0

我不知道如果我按照這個規格:

我有兩個表。一個有一個哈希的白名單。當我向另一個表中插入新行時,我想首先將插入語句中的散列與白名單進行比較。如果是在白名單中,我不想做插入

我第一次嘗試是這樣的:

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

我不認爲你需要觸發此水平,除非有在您的要求中缺少詳細信息。

+0

Mysql插入不支持where子句,所以這不起作用。是個好主意。由於缺乏對where子句的支持,我在查看觸發器之前,也曾想過它(偉大的思想家都一樣)。 – user2891127

+0

你真的試過這個查詢嗎?我測試了它使用MySQL 5.6 –

+0

是的。它給了我一個語法錯誤。我的聲明是:INSERT INTO fileaudit.filelist(rsTime,CName,OS,Path,FileName,Hash)值('20131010121919','HOU1287','WIN_7','C:\\ Windows \\ SysWOW64 \\',' cscript.exe','3d58143149fbe29c3a43baf14277c6b2')WHERE NOT EXISTS(SELECT md5hash FROM whitelist where md5hash ='3d58143149fbe29c3a43baf14277c6b2');並且散列在白名單中。錯誤#1064 'WHERE NOT EXISTS'(SELECT md5hash FROM whitelist where md5hash ='3d58143149fbe29c'at line 1 – user2891127

0

我認爲你正在做某種ON INSERT觸發器。 您需要將下面的語句添加到您的觸發,使其工作通緝:

FOR EACH ROW 

這將使扳機的每一行上執行一次。

+0

這不是問題。 OP僅顯示觸發器的相關部分。 –

+0

當我閱讀它時,問題是如果一行已經在白名單表中,它將跳過整個行集 - 這是OP要避免的。如果我誤解了它,也許這個問題需要更新一些澄清。 –

+0

西蒙對這個問題的解釋(上面的評論)是正確的。可悲的是,答案並非如此。我通過phpmyadmin創建了這個觸發器。它確實自動添加了「每行」。 – user2891127