2012-01-15 109 views
0

我的代碼很長,所以我會讓它變得簡單。 我有以下幾點:是否有任何解決方案爲MYSQL錯誤代碼:1442?

table1 --> have a trigger on insert (call function1 to insert into table2) 
table2 --> have a trigger on insert (call function2) 

function2() 
update table1 depending on a query that table1 is related to. 

和我得到,因爲它已經被用於通過調用這個語句錯誤不能在存儲函數/觸發更新表table1 ....

那麼,有沒有解決方案或解決方法...

+0

你是說table2上的觸發器將記錄插入到table1中? – 2012-01-15 18:42:44

+0

不,它正在運行一個函數來更新table1 – 2012-01-15 18:57:24

+0

當實際代碼很大時(實際上,只要您發佈代碼),您總是可以生成一個[minimal sample case](http://sscce.org/)的模糊圖。 – outis 2012-01-16 01:21:30

回答

1

要理解觸發器的事情是他們是交易的一部分。

因此,插入表1,觸發插入更新table1的表2,可能會導致原始插入自身碰撞。沒有完成與MySQl的觸發器,理論上這可能是好的,如果它試圖更新最初插入的記錄,其實際上還沒有提交......

嘗試並避免這種情況是通常的最佳建議,然而,如果你不能,一箇中間表可能會工作(插入到表中並讓它觸發對錶1和2的更改),或者更好的是,而不是使用直接插入,使用存儲過程並使其更新表1 & 2 cummulativley。

例如取而代之的是插入Table1 = A,這導致Table2 = B導致Table1(A)變爲C ,SP查找B對A做什麼並將其插入到A(c)中並將其插入到B中的對應記錄中。

觸發器很棒,但不要對他們生氣。

+0

好吧,我喜歡中間表的想法,但我想如果我插入需要更新的表中的值,並創建一個觸發器來更新table1,更新仍然是交易的一部分,它將是同樣的問題。 – 2012-01-16 08:20:07

+0

必須有足夠的數據/邏輯在中間'工作'應該在表1和2中應該去。因此插入到中間觸發器插入到deopendant表,他們不會觸發對方。我更喜歡sp解決方案,它更多的是在你的面前,你可以設置權限,只有SP可以插入到任何一個表中,儘管如果邏輯變得更復雜或者變得更復雜,這可能會導致額外的工作。 – 2012-01-16 17:39:03

相關問題