PostgreSQL:删除从另一个表引用的行

PostgreSQL:删除从另一个表引用的行,sql,postgresql,foreign-keys,referential-integrity,Sql,Postgresql,Foreign Keys,Referential Integrity,我有两个表,object和object_数据,其中object通过外键引用object_数据(关系为1:1)。对于一组对象,我需要将它们的object_数据引用设为null,并删除相应的object_数据行,如下所示: DELETE FROM object_data WHERE id IN ( SELECT object_data_id FROM object WHERE ... ); UPDATE object SET object_data_id = NULL WHERE ...; 问题

我有两个表,object和object_数据,其中object通过外键引用object_数据(关系为1:1)。对于一组对象,我需要将它们的object_数据引用设为null,并删除相应的object_数据行,如下所示:

DELETE FROM object_data WHERE id IN
( SELECT object_data_id FROM object WHERE ... );

UPDATE object SET object_data_id = NULL WHERE ...;
问题是,外键约束不允许删除仍然从对象引用的对象\ U数据行

我当前的解决方案是将
SELECT
的结果读取到列表中,然后将外键置零,然后使用in运算符以合理大小的批删除对象_数据行。有更好的解决办法吗?添加从object_数据引用回object的列不是一个选项。

是使用CTEs(公共表表达式)

第一个名为tmp的CTE首先执行,并在以后记住所需的数据 第二个名为upd的CTE将字段设置为NULL
最后,DELETE使用来自tmp的数据来执行DELETE

SOND,就像更新时将NULL设置为FK约束的
修饰符的完美工作一样

设置空值

将引用列设置为null

对象
中的尊重自动设置为空

除此之外,这听起来很奇怪:

我有两个表,object和object_数据,带有对象引用 通过外键的对象_数据(关系为1:1)


通常,在这种情况下,我希望引用从
object\u data
object
相反,但这只是从表名猜出来的。

您可以创建一个临时表:

CREATE TEMP TABLE object_data_ids AS
SELECT object_data_id FROM object WHERE ...;
然后在更新和删除中使用临时表:

UPDATE object SET object_data_id = NULL WHERE object_data_id IN
(SELECT object_data_id FROM object_data_ids);


DELETE FROM object_data WHERE id IN
(SELECT object_data_id FROM object_data_ids);
DELETE FROM object_data WHERE id ...
CREATE TEMP TABLE object_data_ids AS
SELECT object_data_id FROM object WHERE ...;
UPDATE object SET object_data_id = NULL WHERE object_data_id IN
(SELECT object_data_id FROM object_data_ids);


DELETE FROM object_data WHERE id IN
(SELECT object_data_id FROM object_data_ids);