どうやら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 エンジン (パフォーマンス上の理由) を使用しているため、外部キーを使用できません。