5

私は(少なくとも私にとっては)ちょっとしたパズルを持っていますが、それは主に、私がまだ宇宙のSQLマスターではないからだと思っています。基本的に私は3つのテーブルを持っています:

表 A、表 B、および表 C。

テーブル C にはテーブル B への FK (外部キー) があり、テーブル B にはテーブル A への FK があります (これらはそれぞれ多対 1 です)。

テーブル A からエントリを削除する必要があり、もちろんテーブル B と C からも対応するすべてのエントリを削除する必要があります。これまでは、カーソルを使用してこれを行い、テーブル B のすべてのエントリを選択し、それぞれを循環して削除していました。表Cの対応するすべてのエントリ。これで機能します-そして正常に機能していますが、カーソルを使用せずにこの効果を達成するためのより良い方法があると思います/願っています. それが私の質問です。カーソルを使用せずにこれを行うにはどうすればよいですか、またはそれを行うことができますか?

(私がはっきりしていない場合はお知らせください - 質問を修正しようとします)。

4

4 に答える 4

11

FOREIGN KEYあなたの s を次のように宣言しますON DELETE CASCADE

于 2009-09-28T14:14:25.187 に答える
8

あなたはこれをいくつかの方法で行うことができます...

CREATE TABLE TableB
    (FKColumn INT,
     CONSTRAINT MyFk FOREIGN KEY (FKColumn) 
         REFERENCES TableA(PKColumn) ON DELETE CASCADE)
  • 各テーブルで削除トリガーを使用して、関連するレコードを削除できます。

CREATE TRIGGER cascade_triggerA
    ON TableA 
    FOR DELETE
AS 
BEGIN

    DELETE TableB
    FROM   TableB JOIN DELETED ON TableB.FKColumn = DELETED.PKColumn

END

CREATE TRIGGER cascade_triggerB 
    ON TableB 
    FOR DELETE
AS 
BEGIN

    DELETE TableC
    FROM   TableC JOIN DELETED ON TableC.FKColumn = DELETED.PKColumn

END
  • MS SQL サーバーを使用している場合は、INSTEAD OF DELETEトリガーも使用できます。この場合、TableA だけにトリガーを作成し、3 つのテーブルすべてからレコードを削除するすべてのロジックをトリガーに配置します。

上記のいずれの場合でも、テーブル A からレコードを削除するだけで、あとはカスケードとトリガーに任せることができます。

于 2009-09-28T14:16:05.200 に答える
5

既に与えられた回答 (Cascading Deletes and Triggers) は素晴らしいものですが、これらが選択肢にない環境で作業する可能性があります。その場合、以下は純粋な SQL ソリューションです。この例は、DELETE 構文のみに関連しています。現実の世界では、おそらくこれをトランザクション内にラップし、ストアド プロシージャとして実装するでしょう。

--
DECLARE @Param_PK_TableA   int
SET     @Param_PK_TableA   = 1500


-------------------------------
-- TABLE C --------------------
DELETE TableC

FROM TableC

     INNER JOIN TableB
             ON TableB.TableB_ID    = TableC.TableB_ID

     INNER JOIN TableA
             ON TableA.TableA_ID    = TableB.TableA_ID 

WHERE
    (TableA.TableA_ID = @Param_PK_TableA)



-------------------------------
-- TABLE B --------------------
DELETE TableB

FROM TableB

     INNER JOIN TableA
             ON TableA.TableA_ID    = TableB.TableA_ID

WHERE
    (TableA.TableA_ID = @Param_PK_TableA)



-------------------------------
-- TABLE A --------------------
DELETE TableA

WHERE
    (TableA.TableA_ID = @Param_PK_TableA)
于 2009-09-28T15:29:59.713 に答える
2

両方のテーブルの外部キー関係を作成するときに、ON DELETE CASCADE を指定すると、A のレコードを削除するときにこれが処理されます。

于 2009-09-28T14:15:29.023 に答える