我试图将文件制作者专业版的数据库导入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;
答案 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
可能会变得危险。既然你正在处理一团糟,这不太可能。详细说明: