PostgreSQL:删除从另一个表引用的行
我有两个表,object和object_数据,其中object通过外键引用object_数据(关系为1:1)。对于一组对象,我需要将它们的object_数据引用设为null,并删除相应的object_数据行,如下所示: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 ...; 问题
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的数据来执行DELETESOND,就像更新时将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);