删除所有违反新唯一约束的记录

Posted

技术标签:

【中文标题】删除所有违反新唯一约束的记录【英文标题】:Delete all records that violate new unqiue constraint 【发布时间】:2021-10-24 01:25:56 【问题描述】:

我有一个包含以下字段的表

----------------------------------
|  id  |  user_id   |   doc_id   |
----------------------------------

我想创建一个新的唯一约束以确保没有重复的 user_id 和 doc_id 记录。 Aka 用户只能链接到一个文档一次。这很简单。

ALTER TABLE mytable
    ADD CONSTRAINT uniquectm_const UNIQUE (user_id, doc_id);

问题是我有当前违反该约束的记录。我想知道是否有一种简单的方法可以查询这些记录或告诉 postgres 删除任何违反约束的内容。

【问题讨论】:

见here或here或here 【参考方案1】:

识别违反新密钥的记录:

SELECT *
FROM
   (
      SELECT id, user_id, doc_id
         , COUNT(*) OVER (PARTITION BY user_id, doc_id) as unique_check
      FROM mytable
   )
WHERE unique_check > 1;

然后你可以从那些重复中找出应该删除的并执行删除。

据我所知,没有其他方法可以执行此操作,因为任何自动“删除任何重复”命令都会让数据库引擎决定要删除两个或多个重复记录中的哪一个。

如果整个记录是重复的(所有列都匹配),那么您可以使用新的唯一约束创建一个新表并执行INSERT INTO newtable SELECT DISTINCT * FROM oldtable,但我打赌情况并非如此。

【讨论】:

以上是关于删除所有违反新唯一约束的记录的主要内容,如果未能解决你的问题,请参考以下文章

oracle数据导入时,提示违反唯一约束性?

如何使用hibernate避免遇到违反唯一约束的问题?

IntegrityError:重复键值违反唯一约束

重复的键值违反了唯一约束,CakePHP

违反唯一约束会导致整个 pq.CopyIn postgresql 导入失败

django:IntegrityError:重复键值违反唯一约束