构建级联删除的单个查询

时间:2012-11-16 08:55:54

标签: sql

我在SQL中有一个关于DELETE查询的问题。我有3个子表,例如B,C,D和一个父表A.A的Priamry键在其所有子表中共享。如果我必须从子表中删除记录,然后从单个SQL中的父项中删除,那么它是否可能?如果是,您可以指导我进行SQL查询构造吗?如果不是,至少可以在单个查询中从子表中删除记录吗?

2 个答案:

答案 0 :(得分:0)

如果您没有ON DELETE CASCADE的外键,那么您应该使用事务:

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

增加: 如果您使用mysql阅读DELETE doc并在此讨论stackoverflow delete-from-two-tables-in-one-query

答案 1 :(得分: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语法,但我认为这不是必需的,因为这是标准语法。

相关问题