如何在2列而不是1列中查找重复项

JD *_*cks 94 mysql duplicates

我有一个MySQL数据库表,有两列让我感兴趣.单独地,它们每个都可以有重复,但它们应该永远不会有两个具有相同值的副本.

stone_id只要每个upsharge标题不同,反之亦然.但比如说stone_id= 412和upcharge_title="蓝宝石"这种组合应该只出现一次.

还行吧:

stone_id = 412 upcharge_title = "sapphire"
stone_id = 412 upcharge_title = "ruby"
Run Code Online (Sandbox Code Playgroud)

这不行:

stone_id = 412 upcharge_title = "sapphire"
stone_id = 412 upcharge_title = "sapphire"
Run Code Online (Sandbox Code Playgroud)

是否有查询会在两个字段中找到重复项?如果可能的话,有没有办法将我的数据库设置为不允许这样做?

我使用的是MySQL 4.1.22版

Miy*_*der 177

您应该在两个字段之间设置复合键.这将需要每行的唯一stone_id和upcharge_title.

至于找到现有的重复项,请尝试以下方法:

select   stone_id,
         upcharge_title,
         count(*)
from     your_table
group by stone_id,
         upcharge_title
having   count(*) > 1
Run Code Online (Sandbox Code Playgroud)

  • 一种方法是获取所有不同的数据并重新创建表。 (2认同)

Sea*_*ney 33

我发现使用"ALTER IGNORE"添加unqiue索引很有帮助,它可以删除重复项并强制执行您想要的独特记录.所以语法是:

ALTER IGNORE TABLE `table` ADD UNIQUE INDEX(`id`, `another_id`, `one_more_id`);
Run Code Online (Sandbox Code Playgroud)

这有效地添加了唯一约束,这意味着您永远不会有重复记录,IGNORE会删除现有的重复项.

你可以在这里阅读更多关于eh ALTER IGNORE的信息:http://mediakey.dk/~cc/mysql-remove-duplicate-entries/

更新:@Inquisitive通知我,MySql> 5.5的版本可能会失败:

它在MySQL> 5.5和InnoDB表以及Percona中失败,因为它们具有InnoDB快速索引创建功能[ http://bugs.mysql.com/bug.php?id=40344].在这种情况下,首先运行set session old_alter_table=1,然后上面的命令将正常工作


Jas*_*yon 7

你可以找到这样的重复..

Select
    stone_id, upcharge_title, count(*)
from 
    particulartable
group by 
    stone_id, upcharge_title
having 
    count(*) > 1
Run Code Online (Sandbox Code Playgroud)


Ian*_*son 6

要查找重复项:

select stone_id, upcharge_title from tablename group by stone_id, upcharge_title having count(*)>1
Run Code Online (Sandbox Code Playgroud)

为了避免将来出现这种情况,请在这两个字段上创建一个复合唯一键。


P D*_*ddy 5

顺便说一句,表上的复合唯一约束将从一开始就防止这种情况发生。

ALTER TABLE table
    ADD UNIQUE(stone_id, charge_title)
Run Code Online (Sandbox Code Playgroud)

(这是有效的 T-SQL。不确定 MySQL。)