我有一个关于 SQL 中的 DELETE 查询的问题。我有 3 个子表说 B、C、D 和一个父表 A。A 的主键在其所有子表中共享。如果我必须从子表中删除一条记录,然后在单个 SQL 中从父表中删除,那么有可能吗?如果是的话,你能指导我一个 SQL 查询结构吗?如果不是,至少可以在单个查询中从子表中删除记录吗?
问问题
1098 次
2 回答
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 回答
0
Nahue 的评论和 sufleR 的回答是正确的。如果您在外键关系上指定了 ON DELETE CASCADE,您将能够使用单个DELETE
语句从所有这些表中删除。
如果您没有强制执行此约束,您可以使用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
带有ON 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 回答