3

8つのテーブルから特定の行を削除したい。私の問題は、行が外部キーで接続されていることです。削除したい特定の行に接続しているすべてのデータを削除するにはどうすればよいですか?私のテーブルには、定義テーブル(id、name、max value、min value ...など)、データテーブル(id、user_id、definition_id、....など)および履歴テーブル(データテーブルのすべての変更を保存)が含まれます。

カスケードコマンドでdeleteを使用しようと思いましたが、使用方法が見つかりませんでした。

4

2 に答える 2

5

DELETE CASCADE外部キー制約の属性です。残念ながら、それはステートメントのオプションとして使用できるものではありませDELETEん(実際には本当にクールです)

外部キーがカスケードとして宣言されていない場合は、「上に進む」必要があります。

残念ながら、実際のテーブル構造を表示しなかったので、次のようなものを想定しましょう。

main_table(main_id)
   child_one(id、main_id)
     child_two(id、id_one)
       child_three(id、id_two)

(8つのテーブルを言ったのは知っていますが、デモンストレーションのために少し短くしましたが、基本的な「戦略」は変わりません)

main_id = 42`main_tableから行を削除したいとします。

まず、次のようなものを使用して、child_threeから行を削除する必要があります。

delete from child_three
where id_two in (select id 
                 from child_two 
                 where id_one in (select id
                                  from child_one 
                                  where main_id = 42);

次に、child_twoから行を削除します。

delete from child_two
where id_one in (select id
                 from child_one 
                 where main_id = 42);

次にchild_one:

delete from child_one
where main_id = 42;

そして最後にメインテーブル:

delete from main_table
where id = 42;

一部のSQLクライアントは、実際にこれらのステートメントを生成できます。SQLDeveloperができるかどうかはわかりません。

于 2012-07-29T12:20:12.647 に答える
0

外部キーについて話しているので、InnoDBエンジンを使用していると思います。

削除がカスケード削除として機能するように、テーブルを適切に定義する方が簡単です。

     CONSTRAINT `myForeignKey` FOREIGN KEY (`typeId`)
        REFERENCES `types` (`id`) ON DELETE CASCADE ON UPDATE CASCADE

適切なcreatetableステートメントのリンクは次のとおりです。

mysqlの削除カスケードでどのように使用しますか?

于 2012-07-29T12:20:22.493 に答える