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