如何编写SQL查询以检测重复的主键?

7
假设我想修改表格,使我的主键如下:user_idroundtournament_id。目前有一些重复的行需要清理。查询所有重复行的语句是什么?这是针对MySQL的,我想看到重复的行。

这是用于哪种关系型数据库管理系统?您想查看重复的行还是仅查看重复的键? - Martin Smith
您的表格目前是否具有任何主键?如果有,它是什么? - Martin Smith
说实话,你不能有重复的主键。 - Jon Black
1
@f00 - 这正是引发这个问题的动机。OP清楚地知道,在实现他们想要的主键之前,他们需要清理这些重复项。编辑:哦,我明白你的意思了。刚注意到标题。 - Martin Smith
4个回答

10

从技术上讲,您不需要这样的查询;任何值得一提的关系型数据库都不会允许在表中插入将产生重复主键的行。这种情况违反了主键的定义。

但是,如果您想编写一个查询来查找这些列组的重复项,并在将由这些列组成的主键应用于表之前进行操作,那么以下是所需内容:

select
    t.user_id, t.round, t.tournament_id
from
    table as t
group by
    t.user_id, t.round, t.tournament_id
having
    count(*) > 1

如果您想查看包含多个行的列的组合,只需使用上面的代码即可。但是,如果您想查看每一行中的所有列,那么您需要执行以下操作:

select
    o.*
from
    table as o
        inner join (
            select
                t.user_id, t.round, t.tournament_id
            from
                table as t
            group by
                t.user_id, t.round, t.tournament_id
            having
                count(*) > 1
        ) as t on
            t.user_id = o.user_id and
            t.round = o.round and
            t.tournament_id = o.tournament_id

请注意,如果您需要多次使用结果,则还可以创建一个临时表并在其上进行连接。 临时表

3
SELECT name, COUNT(*) AS counter
FROM customers
GROUP BY name
HAVING COUNT (*) > 1

这就是你要寻找的东西。

table中:

ID    NAME          email
--    ----          -----
 1    John Doe      john@teratrax.com
 2    Mark Smith    marks@teratrax.com
 3    John Doe      jdoe@company.com

将返回

name         counter
----         -------
John Doe           2

0
假定您已经拥有一个包含这三列的表格,或者您可以创建并填充一个包含这三列的表格,此查询将显示重复项。
select user_id, round, tournament_id
from yourtable
group by user_id, round, tournament_id
having count(*) > 1

0

此查询从客户表中选择所有具有重复名称的行,但还显示每个重复项的电子邮件。

SELECT c.name, c.email FROM customers c, customers d
WHERE c.name = d.name
GROUP BY c.name, c.email
HAVING COUNT(*) > 1

这样做的缺点是您必须两次列出要输出的所有列,一次在SELECT子句中,一次在GROUP BY子句中。另一种方法是使用子查询或连接来根据已知重复键列表过滤表格。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接