我有一个MySQL数据库表,有两列让我感兴趣.单独地,它们每个都可以有重复,但它们应该永远不会有两个具有相同值的副本.
stone_id
只要每个upsharge
标题不同,反之亦然.但比如说stone_id
= 412和upcharge_title
="蓝宝石"这种组合应该只出现一次.
还行吧:
stone_id = 412 upcharge_title = "sapphire" stone_id = 412 upcharge_title = "ruby"
这不行:
stone_id = 412 upcharge_title = "sapphire" stone_id = 412 upcharge_title = "sapphire"
是否有查询会在两个字段中找到重复项?如果可能的话,有没有办法将我的数据库设置为不允许这样做?
我使用的是MySQL 4.1.22版
您应该在两个字段之间设置复合键.这将需要每行的唯一stone_id和upcharge_title.
至于找到现有的重复项,请尝试以下方法:
select stone_id, upcharge_title, count(*) from your_table group by stone_id, upcharge_title having count(*) > 1
我发现使用"ALTER IGNORE"添加unqiue索引很有帮助,它可以删除重复项并强制执行您想要的独特记录.所以语法是:
ALTER IGNORE TABLE `table` ADD UNIQUE INDEX(`id`, `another_id`, `one_more_id`);
这有效地添加了唯一约束,这意味着您永远不会有重复记录,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
,然后上面的命令将正常工作
你可以找到这样的重复..
Select stone_id, upcharge_title, count(*) from particulartable group by stone_id, upcharge_title having count(*) > 1