2011-06-28 34 views
4

顯然,MySQL對於無法在爲同一表定義的觸發器內更新表的操作非常煩人。
我正在使用MySQL版本5.1並且出現錯誤:「無法更新存儲的函數/觸發器中的表,因爲它已被調用此函數的語句使用/觸發器」。MySQL:在自己的觸發器中更新表

我有這樣的:

create table folder(
    id int unsigned not null auto_increment PRIMARY KEY , 
    name varchar(100) not null , 
    parentId int unsigned not null 
) ; 

這是一個分層文件夾結構。一個文件夾有一個名稱,可能還有一個父文件夾(如果沒有,則parentId爲零)。
當文件夾被刪除時,我需要更改其中所有子文件夾的parentId,以便它們不會成爲不存在文件夾的子文件夾。

這是相當簡單的(幾乎是微不足道的):

CREATE [email protected] TRIGGER onFolderDelete after delete ON folder 
FOR EACH ROW update folder set parentId=0 where parentId=old.id ; 

然而,這樣一個簡單的觸發器是不是由MySQL允許的,因爲正如我上面所說的,你不能在自己的觸發器中更新的表。

是否有任何方式通過以某種方式模仿其效果來實現這種觸發器?

P.S .:請不要建議順序發送兩個語句(DELETE和UPDATE)。如果沒有別的可能,這顯然是最後的解決方案。

編輯:
我使用MyISAM引擎(性能原因),所以我不能使用外鍵。

回答

4

難道你不能用ON DELETE SET NULL (or DEFAULT)添加外鍵嗎?
UPDATEDEFAULT仍然沒有實現;​​是唯一的選擇......)
所以,你將有類似

create table folder(
id int unsigned not null auto_increment PRIMARY KEY , 
name varchar(100) not null , 
parentId int unsigned null , 
FOREIGN KEY(parentId) REFERENCES folder(id) ON UPDATE CASCADE ON DELETE SET NULL  
) ; 
+0

我使用的是不支持外鍵的MyISAM引擎。這是一個高流量的網站,所以MyISAM是由於性能原因而需要的。 – GetFree

+0

好的,但你可能需要在你的問題中指定它.... – a1ex07

+1

另外,我相信你可以有一個INNODB表... – a1ex07