【问题标题】:Delete rows that violate constraint after update postgres更新 postgres 后删除违反约束的行
【发布时间】:2020-04-10 09:13:06
【问题描述】:

我的 postgres 数据库中有一个表,它基本上是一个大学字典,有两列:id 和 name。

我需要对字典进行一些清理,并且需要执行以下操作:

update university_dictionary set name=replace(name, 'NY', 'New York');

问题是name 列上设置了唯一约束,因此如果存在University of NYUniversity of New York,则此更新将导致唯一约束违规。有没有办法在更新后删除违反约束的记录?

【问题讨论】:

  • 我很困惑为什么你要等到更新之后删除记录。为什么不直接删除多余的记录?
  • 好点,虽然我不确定在这种情况下删除语句的where 条件是什么?
  • @Matt:你希望最后保留哪两行?您需要有一种方法可以在这两者之间进行选择,这就是您的 WHERE 子句。如果您无法再将这两者区分开来,那么在更新后(如果可能的话)删除将是随机的/不可能的。
  • 留下哪一个并不重要,只是为了它,原来的总是可以保留。你是说对于像纽约大学这样的每一个案例,我都需要写一个不同的具体声明来删除这个条目?
  • @Matt :如果保留原始文件是您想要的,那么我相信这可能只是DELETE。如果您想删除会产生冲突的行,那么 DELETE FROM university_dictionary WHERE EXIST (...) 可能就是您想要的(很难说,因为我们已经偏离了原始问题)。

标签: sql database postgresql


【解决方案1】:

您可以通过两个查询来做到这一点。

delete from university_dictionary a
where name like '%NY%' and 
    exists(select 1 from university_dictionary b
                where replace(a.name, 'NY', 'New York')=b.name);

update university_dictionary set name=replace(name, 'NY', 'New York')
where name like '%NY%';   

在执行生命数据之前先测试一下。没有太多数据可以尝试:-)

最好的问候, 比亚尼

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-05
    • 2019-01-02
    • 2021-05-09
    • 2019-11-05
    • 2017-11-18
    • 2021-10-24
    • 1970-01-01
    相关资源
    最近更新 更多