1

SQLのDELETEクエリについて1つ質問があります。B、C、Dという3つの子テーブルと1つの親テーブルAがあります。AのPriamryキーは、そのすべての子テーブルで共有されます。単一のSQLで子テーブルからレコードを削除してから親からレコードを削除する必要がある場合、それは可能ですか?はいの場合、SQLクエリ構造について教えていただけますか?そうでない場合は、少なくとも1回のクエリで子テーブルからレコードを削除することは可能ですか?

4

2 に答える 2

0

Nahue のコメントと suflR の回答は正しいです。DELETE外部キー関係に ON DELETE CASCADE を指定すると、単一のステートメントを使用してこれらすべてのテーブルから削除できます。

この制約が適用されていない場合は、ALTER TABLEステートメントを使用して適用できます。私はあなたのスキーマを

A (a_pk, ...) -- PRIMARY KEY specified on a_pk
B (b_pk, a_fk, ...)
C (c_pk, a_fk, ...)
D (d_pk, a_fk, ...)

それで、

ALTER TABLE b
ADD CONSTRAINT b_a_fk
a_fk REFERENCES a(a_pk) ON DELETE CASCADE;

ALTER TABLE c
ADD CONSTRAINT c_a_fk
a_fk REFERENCES a(a_pk) ON DELETE CASCADE;

ALTER TABLE d
ADD CONSTRAINT d_a_fk
a_fk REFERENCES a(a_pk) ON DELETE CASCADE;

すべてのテーブルは、これらすべてのテーブルにFOREIGN KEYwithON DELETE CASCADE参照制約を適用します。

今、あなたが発行する場合

DELETE FROM a WHERE a_pk = <some value>

次に、これにより、B、C、および D からレコードが削除され、それぞれのa_fk = <some value>.

クエリで Oracle 構文を使用したことに注意してください。これらを DBMS 構文に合わせて変換する必要がありますが、これは標準の構文であるため、その必要はないと思います。

于 2012-11-25T04:40:48.320 に答える
0

ON DELETE CASCADE の外部キーがない場合は、トランザクションで行う必要があります。

BEGIN;
  DELETE FROM B WHERE ...
  DELETE FROM C WHERE ...
  DELETE FROM D WHERE ...
COMMIT;

追加: mysql を使用する場合は、ここでDELETE ドキュメントとディスカッションを参照してください。stackoverflow delete-from-two-tables-in-one-query

于 2012-11-16T09:12:41.963 に答える