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

时间:2011-05-08 21:23:10

标签: mysql sql primary-key

假设我想要更改表,以便我的主键如下

user_idroundtournament_id

目前我需要清理重复项。查找所有重复项的查询是什么?

这是针对MySQL的,我希望看到重复的行

4 个答案:

答案 0 :(得分:8)

从技术上讲,您不需要这样的查询;任何值得盐的RDBMS都不允许插入会在表中产生重复主键的行。这样的事情违反了主键的定义。

但是,如果您要在将主键应用于包含这些列的表之前编写查询以查找这些列列的副本,那么这就是您想要的:

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

请注意,如果您需要多次使用结果,您还可以创建temporary table并加入其中。

答案 1 :(得分:2)

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

答案 2 :(得分:0)

假设您有一个包含这三列的表,或者您可以使用这三列创建和填充表,则此查询将显示重复项。

select user_id, round, tournament_id
from yourtable
group by user_id, round, tournament_id
having count(*) > 1

答案 3 :(得分:0)

此查询选择customers表中具有重复名称的所有行,但也显示每个副本的电子邮件。

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子句中。另一种方法是使用子查询或联接来根据已知重复键列表过滤表。