0

中間テーブルを介して MxN 関係で関連付けられている 2 つのエンティティ A と B があるため、合計 3 つのテーブルが作成されます。私のリレーション テーブル R には、他の 2 つのテーブルに null 非許容の FK 制約があります。

Aが何らかの制約に従うテーブルA、B、およびRからすべてのエントリを削除したい(たとえば、テーブルにIDを指定できます)。

ストアド プロシージャに頼らず、null 以外の制約に違反することなく、3 つのテーブルからエントリを削除することは可能ですか?

私は次のようなものが欲しい:

delete from A a, B b, R r where a.id=r.fk_a and B.id=r.fk_B a
4

2 に答える 2

2

場合によります。r と b の間の fk が で指定されているON DELETE CASCADE場合、次のことができます。

START TRANSACTION;

DELETE FROM b
WHERE  id IN (
    SELECT r.b_id
    FROM       r
    INNER JOIN a
    ON         r.a_id = a.id
    WHERE      <some condition on a>
);

DELETE FROM a
WHERE      <some condition on a>;

COMMIT WORK;

カスケード削除がない場合は、一時テーブルを使用して実行できます。

CREATE TEMPORARY TABLE to_be_deleted_from_b 
LIKE b;

START TRANSACTION;

INSERT INTO to_be_deleted_from_b
SELECT * 
FROM b
INNER JOIN r
ON         b.id = r.b_id
INNER JOIN a
ON         r.a_id = a.id
WHERE      <some condition on a>;

DELETE FROM r
WHERE  a_id IN (
    SELECT a.id
    FROM   a
    WHERE  <some condition on a>
);

DELETE FROM a
WHERE  <some condition on a>;

DELETE FROM b
WHERE b.id IN (
    SELECT id
    FROM   to_be_deleted_from_b
);

COMMIT WORK;

DROP TABLE to_be_deleted_from_b
于 2010-02-10T13:41:40.243 に答える
1

これは、3 回の削除と一時テーブルを使用して行うことができます。

  • まず、削除するすべてのレコードを一時テーブルに追加します。
  • 次に、制約に適合するすべての関係を中間テーブルから削除します。
  • 第三に、中間テーブルに存在しないすべてのレコードを A から削除します。
  • 最後に、中間テーブルに存在しないすべてのレコードを B から削除します。

BEGIN TRAN

INSERT INTO #R
SELECT R.*
FROM R r
     INNER JOIN A a ON a.ID = r.fk_a
WHERE a.Column = 'AConstraint'

DELETE FROM R
FROM R r
     INNER JOIN A a ON a.ID = r.fk_a
WHERE a.Column = 'AConstraint'

DELETE FROM A
FROM A a
     INNER JOIN #R r ON r.fk_a = a.ID

DELETE FROM B
FROM B b
     INNER JOIN #R r ON r.fk_b = b.ID
WHERE r.ID IS NULL

DROP TABLE #R

COMMIT TRAN
于 2010-02-10T13:41:17.777 に答える