【问题标题】:PostgreSQL import, if constraint not met set nullPostgreSQL 导入,如果不满足约束设置 null
【发布时间】:2014-07-01 18:08:14
【问题描述】:

我正在尝试将一个数据库从 file-maker pro 导入 PostgreSQL。由于维护不善,随着时间的推移,数据表之间的链接出现了一些退化。
我尝试导入没有约束的数据,然后使用 USING bock 添加约束,如果引用的值不存在,则将其设置为 null。

我有两张桌子,一张people 桌子和一张show 桌子。我想在show 表的show_leader_id 列中将所有不存在的人员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;

【问题讨论】:

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


    【解决方案1】:

    使用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 中运行两者。 (但您的情况可能并非如此。)

    如果people.person_id 中有NULL 值,NOT IN 可能是危险的。由于您正在处理一团糟,这并非不可能。详情:

    【讨论】:

      猜你喜欢
      • 2022-11-10
      • 1970-01-01
      • 2015-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多