我有一个名为"user_links"的PostgreSQL数据库表,该表目前允许以下重复字段:
year, user_id, sid, cid
唯一约束目前是第一个名为"id"的字段,但我现在想添加一个约束,以确保year
、user_id
、sid
和cid
都是唯一的,但我无法应用该约束,因为已经存在违反该约束的重复值.
有没有办法找到所有的副本?
我有一个名为"user_links"的PostgreSQL数据库表,该表目前允许以下重复字段:
year, user_id, sid, cid
唯一约束目前是第一个名为"id"的字段,但我现在想添加一个约束,以确保year
、user_id
、sid
和cid
都是唯一的,但我无法应用该约束,因为已经存在违反该约束的重复值.
有没有办法找到所有的副本?
基本思路是使用带有计数聚合的嵌套查询:
select * from yourTable ou
where (select count(*) from yourTable inr
where inr.sid = ou.sid) > 1
可以调整内部查询中的where子句以缩小搜索范围.
对于 comments 中提到的问题,还有另一个很好的解决方案(但不是每个人都读):
select Column1, Column2, count(*)
from yourTable
group by Column1, Column2
HAVING count(*) > 1
或更短:
SELECT (yourTable.*)::text, count(*)
FROM yourTable
GROUP BY yourTable.*
HAVING count(*) > 1