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