2012-02-10 131 views
3

我正在運行MySQL 5.5.9和InnoDB。無法更新在AFTER INSERT中執行的觸發器表

我嘗試創建一個版本化表,其中current字段指示記錄是否爲最新版本。喜歡的東西:

| autonumber | id | name | current 
| 1   | 1 | Yes | 0 
| 2   | 1 | No | 1 

無論如何,我通過一個AFTER INSERT觸發與同一個ID current = 0更新中的所有記錄MSSQL這樣做,在過去經常。所以在這裏,我們走在MySQL:

DELIMITER | 

CREATE TRIGGER TRIGGER_Products_UpdateEarlierVersions AFTER INSERT ON Products 
FOR EACH ROW BEGIN 
    UPDATE Products 
    SET current = 0 
    WHERE id = new.id 
     AND current = 1 
     AND autonumber <> new.autonumber; 
END; 
| 

這運行正常,但插入記錄時:

insert into Products (id, name) 
values (1, "Hello SO!"); 

我收到以下錯誤:

Error Code: 1442. Can't update table 'Products' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

有沒有解決的辦法實現類似的事情?

回答

2

當你插入一條記錄MySQL是做一些鎖的東西從這裏http://forums.mysql.com/read.php?99,122354,122505#msg-122505

when you insert a record mysql is doing some lock stuff. you can't insert/update/delete rows of the same table where you insert.. because then the trigger would called again and again.. ending up in a recursion

+0

我沒有鎖定,記錄已經更新。 – 2012-02-10 12:08:45

+0

你正在鎖定它:)))這是它的工作方式,如果你更新它被鎖定的東西。行,頁面,表格等。正如我寫的嘗試並使用BEFORE觸發器。 – 2012-02-10 12:11:11

0

在MySQL中,無法更新在觸發器中爲其創建觸發器的表('Products')。

根據MySQL文檔,這個錯誤是爲了防止無限遞歸而產生的:當UPDATE發生時,觸發器運行並更新表,這個觸發器UPDATE會導致觸發器再次運行,並且一次又一次地結束在無限循環中。

+0

這就是錯誤的表白,而是我在尋找辦法解決它。 – 2012-02-10 12:04:52

+0

最終嘗試使用BEFORE觸發器 – 2012-02-10 12:06:41

+1

你可以嘗試在一個過程中做同樣的更新工作嗎? – 2012-02-10 12:11:32

0

服用。你不能插入/更新/刪除你插入的同一張表的行。因爲那麼觸發器會一次又一次地被調用。以遞歸結束

我曾經有這個問題。我刪除了更新命令。所以,試試這個:

DELIMITER | 

CREATE TRIGGER TRIGGER_Products_UpdateEarlierVersions AFTER INSERT ON Products 
FOR EACH ROW BEGIN 

    SET current = 0 
    WHERE id = new.id 
     AND current = 1 
     AND autonumber <> new.autonumber; 
END; 
| 

我認爲這是要去工作

相關問題