Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 删除不同表中其他记录引用的记录_Sql_Postgresql_Foreign Keys_Sql Delete - Fatal编程技术网

Sql 删除不同表中其他记录引用的记录

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 (

我有以下要求:

我需要根据给定的ID从一个表中删除记录,现在这个表被另一个表引用,另一个表被另一个表引用,最后一个表也被另一个表引用,所以我有一个这样的链:

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);