2016-11-13 121 views
1

我想要插入觸發器來實現增量插入。我有一列「row_hash」來記錄每行的MD5(這裏我使用第namecategory列的MD5)。如果新記錄具有相同的散列值,則觸發器應跳過插入,否則允許插入。MySql插入觸發器輸出NULL

DROP TRIGGER IF EXISTS test_trigger; 
DELIMITER $$ 
CREATE TRIGGER test_trigger BEFORE INSERT ON test_table FOR EACH ROW 
BEGIN 
    IF (SELECT COUNT(*) FROM test_table WHERE row_hash = MD5(CONCAT_WS('', new.name, new.category))) < 1 THEN 
     INSERT INTO test_table(_id, name, category, row_hash) VALUES (new._id, new.name, new.category, MD5(CONCAT_WS('', new.name, new.category))); 
    END IF; 
END$$ 

下面是測試表:

create table test_table(_id varchar(10) primary key, name varchar(10), category varchar(2), row_hash char(32)); 

當我插入一個記錄,它輸出關於row_hash柱NULL。

insert into test_table(_id, name, category) values('12344', 'dafas', 'A'); 

'12344','dafas','A',NULL 

你能告訴我我在觸發器上做錯了嗎?

+0

的[我的MySQL觸發器不起作用,簡單sintax,不復雜]可能的複製(http://stackoverflow.com/questions/40517731/my-mysql-trigger-doesnt-work-simple-sintax - 不復雜) – e4c5

+0

@ e4c5,這不是這個問題的重複。他們有一個共同點 - MySQL觸發器 - 但所描述的問題是不同的。 –

回答

0

如果要修改插入的行,則不需要在同一個表中使用INSERT。只需SET NEW.row_hash值。

如果您想中止插入,您必須使用SIGNAL

但總體而言,看起來您所做的事情在觸發器中根本不需要條件INSERT。只有名稱,類別上的UNIQUE約束。在觸發器中,只要確保row_hash設置正確,那麼如果有重複,約束將處理中止。

編輯:如您所建議的那樣,將唯一鍵更改爲僅使用row_hash列。

ALTER TABLE test_table ADD UNIQUE KEY (row_hash); 

CREATE TRIGGER test_trigger BEFORE INSERT ON test_table 
FOR EACH ROW SET NEW.row_hash = MD5(CONCAT_WS('', name, category)); 
+1

好點!我按照你的想法在row_hash上添加了一個唯一的鍵,因爲我有很多列來檢查實際情況。這是你的concat_ws用new.name和new.category的小改動。十分感謝! 'CREATE TRIGGER test_trigger BEFORE INSERT ON test_table FOR EACH ROW SET new.row_hash = MD5(CONCAT_WS('',new.name,new.category));' –

+0

是的,就是這樣!您應該使觸發器運行'BEFORE UPDATE',以便在散列鍵列集合中的一列發生更改時執行相同的操作。 –

+0

簡單觸發器的一個好處是,如果觸發器主體是單個語句,則不需要擔心「DELIMITER」。 :-) –