3

親レコードと子レコードを格納するテーブルがあります。

親が削除されたときにすべての子レコードを削除するトリガーを作成しようとしていました:

Delete From tbl Where ParentId = OLD.Id

トリガーを正常に保存できますが、削除すると次のエラーが発生します。

エラー 1442: これを呼び出したステートメントで既に使用されているため、ストアド関数/トリガーのテーブル 'tbl' を更新できません

私は何を間違っていますか?

4

2 に答える 2

7

これは不可能のようです:

トリガーをアクティブにしたテーブルの行を削除することはできません。

あなたが考えるかもしれないいくつかの他のオプション:

  1. 親と子の行を削除するアプリケーション ロジックを記述し、親レコードを直接削除するのではなく、削除するたびにこのアプリケーション ロジックを呼び出します。
  2. 同じテーブルで削除関係をカスケードします。これは可能と思われます
  3. 孤立した子レコードを定期的に消去するクリーンアップ プロセス。
  4. (@Chris が提案) 別のテーブルを追加して、親レコードから子レコードを分離します。
于 2011-05-04T15:24:15.027 に答える
0

秒。Delete Cascade同じテーブルで子レコードを作成することができます。MYSQLフォーラムのこの投稿に答えがありました。これが私がそれを機能させる方法です。

  1. プライマリ ID の親が NULL に設定されていることを確認する必要がありました。
  2. プライマリ ID と親 ID が、INT などのまったく同じ種類のフィールドに設定されていることを確認する必要がありました。
  3. また、プライマリ ID が自動インクリメントに設定されていることを確認する必要がありました。

MYSQL フォーラムから:

create table edges(
  ID int PRIMARY KEY,
  parentid int,
  unique key(id, parentid),
  foreign key(parentID) references edges(ID) ON DELETE CASCADE ON UPDATE CASCADE
) engine=innodb; 

insert into edges(ID,parentID) values (1,null),(2,1),(3,1),(4,2);

これを実行して、親とすべての子がカスケードを削除するのを確認します。

delete from edges where id=2;

select * from edges will then show two records left.  Record 1 and record 3.

これは、ユーザーがアルバム内のアルバム内にアルバムを作成できるギャラリーである私のプロジェクトにとって非常に大きなものでした。

于 2015-12-31T16:28:06.877 に答える