Sql 删除不同表中其他记录引用的记录
我有以下要求: 我需要根据给定的ID从一个表中删除记录,现在这个表被另一个表引用,另一个表被另一个表引用,最后一个表也被另一个表引用,所以我有一个这样的链:Sql 删除不同表中其他记录引用的记录,sql,postgresql,foreign-keys,sql-delete,Sql,Postgresql,Foreign Keys,Sql Delete,我有以下要求: 我需要根据给定的ID从一个表中删除记录,现在这个表被另一个表引用,另一个表被另一个表引用,最后一个表也被另一个表引用,所以我有一个这样的链: DELETE FROM table_4 WHERE pk_of_table_3 IN (SELECT id FROM table_3 WHERE pk_of_table_2 IN (
DELETE FROM table_4
WHERE pk_of_table_3 IN
(SELECT id
FROM table_3
WHERE pk_of_table_2 IN
(SELECT id FROM table 2 WHERE pk_of_table_1 = ?
)
)
表1使用链接DELETE语句的公共表表达式执行此操作:
with delete_t1 as (
delete from table_1
where pk = 42
returning pk
), delete_t2 as (
delete from table_2
where pk_of_table_1 in (select pk from delete_t1)
returning pk
), delete_t3 as (
delete from table_3
where pk_of_table_2 in (select pk from delete_t2)
returning pk
)
delete from table_4
where pk_of_table_3 in (select pk from delete_t3);
如果您总是这样做,考虑将外键约束定义为删除级联,那么您只需要从表1删除,而PASGRESs将处理其余部分。
< P>用一个公共表表达式来链接删除语句:with delete_t1 as (
delete from table_1
where pk = 42
returning pk
), delete_t2 as (
delete from table_2
where pk_of_table_1 in (select pk from delete_t1)
returning pk
), delete_t3 as (
delete from table_3
where pk_of_table_2 in (select pk from delete_t2)
returning pk
)
delete from table_4
where pk_of_table_3 in (select pk from delete_t3);
如果你总是这样做,考虑把外键约束定义为删除级联,那么你只需要从表1删除,PASGRESs会处理其余部分。加入……的行列。。哪里a、 x=b.y和d.z=@wildplasser性能方面的差异有多大?我不知道oracle,但应该没有差异。关于删除级联外键呢?从存在的位置删除选择*从b加入c ON。。加入……的行列。。哪里a、 x=b.y和d.z=@wildplasser性能方面的差异有多大?我不知道oracle,但应该没有差异。好的,通过级联删除,您的意思是,如果创建的表允许我这样做,不幸的是,它不允许,我也不允许对此进行任何更改,但是,使用WITH似乎比使用多个子查询更合理。好吧,我让它执行并等待,但我有一个问题,我们为什么在触发最后一个DELETE语句后不获得FK约束,因为最终第一个DELETE_t1应该是按顺序首先执行的,对吗?@it'sBritneyB:因为一切都发生在一个原子语句中,而不是一个接一个的语句中。而包括FKs在内的约束仅在语句完成后才进行检查,而不是在语句运行时进行检查。你们可以想象一切都是在同一时刻发生的。好的,级联删除的意思是,如果创建的表允许我这样做,不幸的是,它不允许,我也不允许对此进行任何更改,但是使用WITH似乎比使用多个子查询更合理。好的,所以我让它执行并等待,但我有一个问题,为什么我们触发最后一个DELETE语句后就不会得到FK约束,因为最终第一个DELETE DELETE_t1应该是按顺序首先执行的语句,对吗?@it'sBritneyB:因为所有事情都发生在一个原子语句中,而不是一个接一个语句中。而包括FKs在内的约束仅在语句完成后才进行检查,而不是在语句运行时进行检查。你可以想象一切都在同一时刻发生。
with delete_t1 as (
delete from table_1
where pk = 42
returning pk
), delete_t2 as (
delete from table_2
where pk_of_table_1 in (select pk from delete_t1)
returning pk
), delete_t3 as (
delete from table_3
where pk_of_table_2 in (select pk from delete_t2)
returning pk
)
delete from table_4
where pk_of_table_3 in (select pk from delete_t3);