Sql 为级联删除构造单个查询

Sql 为级联删除构造单个查询,sql,Sql,我有一个关于SQL中删除查询的问题。我有3个子表,即B、C、D和一个父表A。A的Priamry键在其所有子表中共享。如果我必须在一个SQL中从子表中删除一条记录,然后从父表中删除一条记录,那么有可能吗?如果是,您能指导我进行SQL查询构造吗?如果没有,至少可以在一次查询中从子表中删除记录吗?如果没有带ON delete CASCADE的外键,则应使用事务: BEGIN; DELETE FROM B WHERE ... DELETE FROM C WHERE ... DELETE FR

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

如果没有带ON delete CASCADE的外键,则应使用事务:

BEGIN;
  DELETE FROM B WHERE ...
  DELETE FROM C WHERE ...
  DELETE FROM D WHERE ...
COMMIT;
增加:
如果您使用mysql,请在此处阅读和讨论

Nahue的评论和sufleR的回答是正确的。如果在外键关系上指定了ON-DELETE级联,则可以使用单个
DELETE
语句从所有这些表中删除

如果没有强制执行此约束,可以使用
altertable
语句强制执行。我会把你的模式当作

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;
所有表都将在所有这些表上使用
ON DELETE CASCADE
引用约束强制执行
外键

现在,如果你发行

DELETE FROM a WHERE a_pk = <some value>
DELETE FROM a_pk=
然后这将删除B、C和D中的记录,其中它们的
a\u fk=


请注意,我在查询中使用了Oracle语法。您必须将这些转换为适合您的DBMS语法,但我认为没有必要,因为这是标准语法。

谢谢您的回答。我只是想知道我是否可以从B,C,D中删除以下格式的构造,其中…如果使用级联选项创建外键,则在一个查询中是可能的,否则它取决于DMB。