如何find2列中的重复不是1

我有一个MySQL数据库表,有两列对我很感兴趣。 他们每个人都可以有重复,但是他们不应该有重复的,他们都有相同的价值。

stone_id只要每个标题不一样就可以有重复,反之亦然。 但是比如说stone_id = 412和upcharge_title =“蓝gem”,这个组合应该只出现一次。

还行吧:

 stone_id = 412 upcharge_title = "sapphire" stone_id = 412 upcharge_title = "ruby" 

这是不正确的:

 stone_id = 412 upcharge_title = "sapphire" stone_id = 412 upcharge_title = "sapphire" 

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

我正在使用MySQL版本4.1.22

你应该在两个字段之间build立一个复合键。 这将需要每行的唯一stone_id和upcharge_title。

至于find现有的重复试试这个:

 select stone_id, upcharge_title, count(*) from your_table group by stone_id, upcharge_title having count(*) > 1 

我发现使用“ALTER IGNORE”添加一个unqiue索引是很有帮助的,这个ALTER IGNORE可以删除重复的内容,并且强制执行你想要做的独特的logging。 所以语法是:

 ALTER IGNORE TABLE `table` ADD UNIQUE INDEX(`id`, `another_id`, `one_more_id`); 

这有效地增加了唯一的约束,这意味着你永远不会有重复的logging,IGNORE删除现有的重复。

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

更新:@Inquisitive告诉我,这可能会在MySql> 5.5版本中失败:

由于InnoDB快速索引创buildfunction,它在MySQL> 5.5和InnoDB表上,以及在Percona上失败了[ http://bugs.mysql.com/bug.php?id=40344%5D 。 在这种情况下,首先运行set session old_alter_table=1 ,然后上面的命令将正常工作

要find重复项目:

 select stone_id, upcharge_title from tablename group by stone_id, upcharge_title having count(*)>1 

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

你可以find像这样的重复

 Select stone_id, upcharge_title, count(*) from particulartable group by stone_id, upcharge_title having count(*) > 1 

顺便提一下,表上的复合唯一约束可以防止这种情况发生。

 ALTER TABLE table ADD UNIQUE(stone_id, charge_title) 

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

这个SO贴子帮了我,但我也想知道如何删除并保留其中一行…这是一个PHP解决scheme,删除重复的行,并保留一个(在我的情况下,只有2列,它是在清除重复类别关联的函数)

 $dupes = $db->query('select *, count(*) as NUM_DUPES from PRODUCT_CATEGORY_PRODUCT group by fkPRODUCT_CATEGORY_ID, fkPRODUCT_ID having count(*) > 1'); if (!is_array($dupes)) return true; foreach ($dupes as $dupe) { $db->query('delete from PRODUCT_CATEGORY_PRODUCT where fkPRODUCT_ID = ' . $dupe['fkPRODUCT_ID'] . ' and fkPRODUCT_CATEGORY_ID = ' . $dupe['fkPRODUCT_CATEGORY_ID'] . ' limit ' . ($dupe['NUM_DUPES'] - 1); } 

(限制NUM_DUPES – 1)是保留单行…

感谢所有