4

どうやらMySQLには、同じテーブルに対して定義されたトリガー内でテーブルを更新できないという本当に厄介な制限があります。
MySQL バージョン 5.1 を使用していますが、「この関数/トリガーを呼び出したステートメントで既に使用されているため、ストアド関数/トリガーのテーブルを更新できません」というエラーが表示されます。

私が持っているのはこれです:

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 DEFINER=root@localhost TRIGGER onFolderDelete after delete ON folder
FOR EACH ROW update folder set parentId=0 where parentId=old.id ;

ただし、前述のように、独自のトリガー内でテーブルを更新できないため、このような単純なトリガーは MySQL では許可されていません。

何らかの方法でその効果をエミュレートすることにより、そのようなトリガーを実装する方法はありますか??

PS: 両方のステートメント (DELETE と UPDATE) を順番に送信することはお勧めしません。他に何もできない場合、それが明らかに最後の解決策です。

編集:
MyISAM エンジン (パフォーマンス上の理由) を使用しているため、外部キーを使用できません。

4

1 に答える 1

3

で外部キーを追加できませんON DELETE SET NULL (or DEFAULT)か?
UPDATE (DEFAULTはまだ実装されていません;SET NULLが唯一のオプションです...)
したがって、次のようなものがあります

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      
) ;
于 2011-06-28T15:29:48.340 に答える