如果MySQL表中存在重复值,是否可以创建唯一索引?

7

对于一个已存在的表,可以在一个可能有重复值的列上创建唯一约束吗?

4个回答

9
不,这是不允许的。
以下SQL语句:
ALTER TABLE `table`
ADD UNIQUE (`column`)

会生成以下错误:

#1062 - 重复的条目"data",关键字为"column"

您可以使用以下方法识别重复项:

SELECT * FROM `table`
GROUP BY `column`
HAVING COUNT(`column`) > 1

在删除所有重复项后,您可以添加UNIQUE约束。


2
注意 - 这将删除所有具有该特定值的记录。你可能只想删除除一个之外的所有记录。 - Robin Maben

4
实际上,在MySQL 5.1+中是可能的。您可以使用以下方法:
ALTER IGNORE TABLE `table` ADD UNIQUE INDEX (`column`);

如果您的表是InnoDB,您需要先运行以下命令:

set session old_alter_table=1

参考资料http://www.mikeperham.com/2012/03/02/deleting-duplicate-rows-in-mysql/

编辑:截至MySQL 5.7.4版本,ALTER TABLE的IGNORE子句已被删除,使用它将产生错误。感谢评论中@EdwardvanKuik指出这一点。


3
自MySQL 5.7.4版本开始,ALTER TABLE的IGNORE子句已被移除,使用它将会产生错误。 - Edward van Kuik

0

这是不可能的:

Mysql2::Error: Duplicate entry 'foo' for key 'index_clubs_on_url': CREATE UNIQUE INDEX `index_clubs_on_url` ON `clubs` (`url`)

0

如果所有重复行中的任何索引列都包含NULL,则是可能的,因为NULL既不等于也不不等于NULL,因此索引值不被视为相等并且允许继续进行。

MariaDB [mydb]> select case when NULL = NULL OR NULL <> NULL then 'true' else 'false' end as 'test';
+-------+
| test  |
+-------+
| false |
+-------+

请参见此处的示例和(可能的)解决方法(当您尝试强制执行唯一行时)。

mysql  Ver 15.1 Distrib 10.3.35-MariaDB, for Linux (x86_64) using readline 5.1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接