2017-06-22 84 views
3

是在插入到某個表之前設置的MySQL觸發器,當我調用INSERT IGNORE並插入被忽略時執行?在INSERT IGNORE插入之前的MySQL觸發器

+0

看看這個[討論](https://bugs.mysql.com/bug.php?id=13473)。在其他數據庫(如Oracle)中,即使沒有插入操作發生,觸發器也會觸發。這在MySQL中似乎是相同的行爲。 –

回答

2

這裏有一個演示:

mysql> create table foo (foo_id int primary key); 

mysql> create table bar (foo_id int); 

mysql> create trigger foo_ins before insert on foo 
     for each row insert into bar set foo_id = new.foo_id; 

mysql> insert ignore into foo set foo_id=123; 
Query OK, 1 row affected (0.01 sec) 

mysql> insert ignore into foo set foo_id=123; 
Query OK, 0 rows affected, 1 warning (0.00 sec) 

這應該已經插在foo表只有一行,因爲第二次嘗試將與主鍵值衝突。我們看到第二次插入會影響0行,這意味着沒有插入新行。

讓我們來看看在吧檯的效果是什麼:

mysql> select * from bar; 
+--------+ 
| foo_id | 
+--------+ 
| 123 | 
| 123 | 
+--------+ 

兩行插入。這證明即使在插入忽略時觸發器也被觸發。

+0

是的,我也試過了,但你回答得更快。 當行被忽略時,是否有一些選項可以停止執行觸發器? –

+0

@Jan,我能想到的唯一解決方案就是將你的代碼放在'AFTER INSERT'觸發器中。如果發生錯誤,導致插入不發生(如違反唯一約束或非空約束),它將在執行AFTER觸發器之前中止。 –

+0

是的,我想使用'AFTER INSERT'觸發器,但已經有另一個更重要,我不想在其中混合另一個邏輯。 –