如果表中有重复的值,可以在MySQL中创建唯一索引吗?

cidc1ykv  于 2023-02-28  发布在  Mysql
关注(0)|答案(4)|浏览(171)

对于现有表,是否允许在可能具有重复值的列上创建唯一的?

9lowa7mx

9lowa7mx1#

不,这是不允许的。
下面的SQL:

ALTER TABLE `table`
ADD UNIQUE (`column`)

将生成以下错误:

1062 -关键字'column'的重复条目'data'

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

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

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

gv8xihay

gv8xihay2#

实际上这是可能的,至少在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在评论中指出这一点

0lvr5msh

0lvr5msh3#

这是不可能的:

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

kt06eoxx4#

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

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

请参阅here示例和(可能的)解决方法(尝试强制唯一行)。

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

相关问题