1

我有一个关于 SQL 中的 DELETE 查询的问题。我有 3 个子表说 B、C、D 和一个父表 A。A 的主键在其所有子表中共享。如果我必须从子表中删除一条记录,然后在单个 SQL 中从父表中删除,那么有可能吗?如果是的话,你能指导我一个 SQL 查询结构吗?如果不是,至少可以在单个查询中从子表中删除记录吗?

4

2 回答 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 回答