2010-03-01 47 views
3

我正在使用mysql,並且有批量插入到我的表中。 我的疑問是,如果我創建一個指定after insert的觸發器,那麼觸發器將被激活,每個insert after,我不想發生。如何在mysql中的所有批量插入之後激活觸發器

在完成所有批量插入操作後,是否有任何方法來激活觸發器?

有什麼建議嗎?

謝謝。

+0

Postgresql已經發送觸發器,不知道是否MySQL提供他們,但。 – ChristopheD 2010-03-01 13:52:16

+0

mysql確實提供了觸發器。 – JPro 2010-03-01 13:54:29

+0

從Mysql文檔:「InnoDB立即檢查外鍵約束;檢查不會延遲到事務提交。」所以它的存儲引擎依賴於 – 2010-03-01 14:09:57

回答

1

如果您擔心的是性能問題,您可以放心,操作速度非常快,即使它是分別在每個插入的行上執行的。但如果您真的認爲這會導致性能問題,那麼您應該進行配置。

我能想到的單一替代方案是放棄觸發器,執行插入查詢並重新添加觸發器,這實際上是一個可怕的解決方案(不幸的是,您無法禁用MySQL中會話的觸發器 - 實際上,您無法禁用他們根本)。

+0

更新了問題 – JPro 2010-03-01 13:58:02

0

觸發語法(>>插入< <後)固有地表示將爲每個插入操作完成。我不知道有什麼方法可以解決這個問題。一個可能的解決方法可能是在插入語句中有一個標誌(某列的某個魔術值,例如-200列的id列),只有在最後一次插入時才爲真,然後有一個if語句在觸發器中檢查國旗。雖然感覺有點像黑客。也許你可以給我們更多的背景,可能有更好的方法去剝皮這隻貓。

+0

一些外部源批量更新我的數據庫,我想根據它提供的值填寫一些額外的文件,這對於同一張表。我雖然它可能會導致衝突,當觸發器被激活並嘗試更新表,而另一個插入正在進行的同一張表。有任何想法嗎? – JPro 2010-03-01 13:53:33

+0

沒有文檔證實這一點,但觸發器可能會在插入下一行之前完成其工作。即使沒有,MySQL也會爲你處理鎖定。 Innodb支持行級鎖定,這意味着如果一個線程忙於更新一行,其他人將無法更新它。不要以爲你不必擔心衝突。你是否想要更新觸發器被激活的同一行中的字段?是否要插入/更新另一行? – 2010-03-01 14:13:43

+0

它給出了以下錯誤:錯誤:ODBC:狀態S1000:[MySQL] [ODBC 5.1驅動程序] [mysqld-5.1.37]無法更新存儲的函數/觸發器中的表'my_table',因爲它已被語句調用這個存儲的函數/觸發器。 – JPro 2010-03-01 14:27:52

2

看看here,看看你是否可以實現這一招,基本上包裝扳機if語句由你可以打開一個變量,並關閉

if (@DISABLE_TRIGER <> 1) then 
#trigger body 
end if; 

,如果你想禁止觸發器比控制在進口只是:

SET @DISABLE_TRIGER = 1; 

#do imports 

SET @DISABLE_TRIGER = 0;