PostgreSQL导入,如果不满足约束,则设置为null

时间:2014-07-01 18:08:14

标签: sql postgresql null foreign-keys referential-integrity

我试图将文件制作者专业版的数据库导入PostgreSQL。由于没有得到很好的维护,随着时间的推移,数据表之间的联系有所下降 我试图在没有约束的情况下导入数据,然后使用USING bock添加约束,如果引用的值不存在则将其设置为null。

我有两个表,一个people表和一个show表。我想在show_leader_id表的show列中将所有不存在的人ID设置为空。这就是我所拥有的:

BEGIN;
ALTER TABLE show ADD FOREIGN KEY (show_leader_id) REFERENCES people 
    USING (CASE WHEN (SELECT COUNT(*) FROM people WHERE person_id=show_leader_id)=1 THEN show_leader_id ELSE NULL END);
COMMIT;

1 个答案:

答案 0 :(得分:2)

使用EXISTS半联接检查是否存在:

UPDATE show s
SET    show_leader_id = NULL
WHERE  NOT EXISTS (SELECT 1 FROM people WHERE person_id = s.show_leader_id);

然后添加你的fk约束。
如果您有并发写入操作,请在同一事务like @Eelke advises中运行。 (但在你的情况下可能并非如此。)

如果NOT IN中有NULL个值,则

people.person_id可能会变得危险。既然你正在处理一团糟,这不太可能。详细说明: