2017-05-31 61 views
1

我有一個觸發(更新之前)在這樣一個表:如何處理觸發器中的碰撞問題?

UPDATE contact_us SET updated_at = unix_timestamp() WHERE id = new.id 

當我通過使用phpMyAdmin更新表中的行,它拋出這個錯誤:

enter image description here

爲了看得更清楚:

#1442 - Can't update table 'contact_us' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

我怎樣才能修復問題?

所有的
+0

也許顯示觸發呢? – FMashiro

+0

@FMashiro [你去](https://i.stack.imgur.com/QW9Bv.png) – stack

+0

顯示存儲過程? – Ravi

回答

2
  1. 首先,你並不需要一個觸發器在所有的這些功能,只需使用一個時間戳或日期字段automatic initialisation。因此,定義updated_at如下:

    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 
    
  2. 如果你堅持要用不管出於什麼原因觸發,即使在當時不使用單獨update語句更新觸發器上,因爲這是一個沒有去定義相同的表(無限循環)。使用NEW關鍵字來訪問新創建的記錄的字段修改字段的內容:

    set NEW.updated_at = unix_timestamp(); 
    
+0

當一行是**創建**,而不是**更新**時,您的第一種方法將工作。 – stack

+0

@stack然後按照文檔建議在字段定義中添加「ON UPDATE CURRENT_TIMESTAMP」。我將它添加到答案中。 – Shadow

+0

聽起來沒錯,但是我現在怎麼能爲'updated_at'行添加'ON UPDATE CURRENT_TIMESTAMP'?我的意思是當前表格已經創建。我需要「改變」嗎? – stack