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

del*_*ber 5 mysql sql primary-key

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

user_id, round, tournament_id

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

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

cas*_*One 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
Run Code Online (Sandbox Code Playgroud)

上面只会为您提供组合具有多行的列的组合,如果要查看行中的所有列,则执行以下操作:

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
Run Code Online (Sandbox Code Playgroud)

请注意,如果需要多次使用结果,还可以创建临时表并加入.