0

たとえば、次の列を持つテーブルがあります。

Name、、 Parent Name_ ID

また、親名がNull(最上位の親であることを意味する)の3つのエントリ(F_one、G_one、およびH_one)があるとします。

それらの親の1つの子孫(G_one、なぜですか?)をすべて削除したい場合は、G_oneのすべての子、それらの子のすべての子、およびそれらの子など、ターミナルレベルまでずっと削除します。ここで、その行は他のエントリのNameとして存在しません。Parent Name

たぶん単一のクエリで、それを簡単に行うことは可能ですか?

ボーナス、G_one系統をすべて選択して、気まぐれに操作できるようにする方法はありますか?

想定できること:-子供は親の間で共有されません

次のことを想定することはできません。-離散的または一貫した数のサブレベル。

4

2 に答える 2

1

@Marc Bの提案として、FORIEGN KEYwithON DELETE CASCADEはこれを達成します。

まだ持っていない場合は、今すぐ追加できます。

  1. (私はキーosを想定しています)にUNIQUE制約がある場合は、この手順をスキップしてください。存在しない場合は、作成します。NamePRIMARYID

    ALTER TABLE tableX
      ADD CONSTRAINT unique_Name
        UNIQUE (Name) ;
    
  2. 前の手順が成功した場合は、:を追加しFOREIGN KEYます。

    ALTER TABLE tableX
      ADD CONSTRAINT fk_Name_ParentName
        FOREIGN KEY (ParentName)
           REFERENCES tableX (Name)
           ON UPDATE CASCADE
           ON DELETE CASCADE ;
    
  3. 前の手順が成功した場合は、次の1つのステートメントで行を削除できます。

    DELETE
    FROM tableX
    WHERE ParentName = 'G_one' ;
    

    これにより、次のようになりY rows affectedます。

于 2012-08-11T21:30:16.673 に答える
0

これをテストすることはできませんが、次のようなものが機能する可能性があると思います。

CREATE TRIGGER casc_del AFTER DELETE on tblName
FOR EACH ROW 
    DELETE FROM tblName 
    WHERE tblName.parent_name is not null 
    AND tblName.parent_name NOT IN (SELECT name FROM tblName)

MySQLのトリガーの詳細については、こちらをご覧ください。注:このアプローチは、5.02以降でのみ機能します。

于 2012-08-11T21:15:31.460 に答える