对于一个已存在的表,可以在一个可能有重复值的列上创建唯一约束吗?
ALTER TABLE `table`
ADD UNIQUE (`column`)
会生成以下错误:
#1062 - 重复的条目"data",关键字为"column"
您可以使用以下方法识别重复项:
SELECT * FROM `table`
GROUP BY `column`
HAVING COUNT(`column`) > 1
在删除所有重复项后,您可以添加UNIQUE
约束。
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指出这一点。
这是不可能的:
Mysql2::Error: Duplicate entry 'foo' for key 'index_clubs_on_url': CREATE UNIQUE INDEX `index_clubs_on_url` ON `clubs` (`url`)
如果所有重复行中的任何索引列都包含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