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

标签 postgresql duplicates sql-delete

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

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

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

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

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

最佳答案

识别违反新 key 的记录:

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 但我我打赌事实并非如此。

关于postgresql - 删除所有违反新的唯一约束的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68896931/

相关文章:

重复列表条目的 C# 问题

php - PDO 查询总是返回 1 或 true

sql - Postgres 9.1 - 获取下一个值

Javascript 文件在 ajax 导航中出现重复

sql - 如何创建一个已经安装了 hstore 扩展的新数据库?

python - 选择并使用 Pandas 数据框中的重复行

php - 该行在 MySQL 中没有被删除并且 PHP 没有返回错误

java - 在一条语句中删除多行

sql - 从一个表中获取月份列表,并从另一个表中计算每个月份的列表

sql - 何时在 SQL 插入中检查表约束?