对于现有表,是否允许在可能具有重复值的列上创建唯一的?
9lowa7mx1#
不,这是不允许的。下面的SQL:
ALTER TABLE `table` ADD UNIQUE (`column`)
将生成以下错误:
您可以使用以下方法标识重复项:
SELECT * FROM `table` GROUP BY `column` HAVING COUNT(`column`) > 1
删除所有重复项后,可以添加UNIQUE约束。
UNIQUE
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在评论中指出这一点
0lvr5msh3#
这是不可能的:
Mysql2::Error: Duplicate entry 'foo' for key 'index_clubs_on_url': CREATE UNIQUE INDEX `index_clubs_on_url` ON `clubs` (`url`)
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
4条答案
按热度按时间9lowa7mx1#
不,这是不允许的。
下面的SQL:
将生成以下错误:
1062 -关键字'column'的重复条目'data'
您可以使用以下方法标识重复项:
删除所有重复项后,可以添加
UNIQUE
约束。gv8xihay2#
实际上这是可能的,至少在MySQL 5.1+中是这样用途:
如果你的表是InnoDB,你需要先运行这个:
参考http://www.mikeperham.com/2012/03/02/deleting-duplicate-rows-in-mysql/
编辑:从MySQL 5.7.4开始,ALTER TABLE的IGNORE子句被删除了,使用它会产生一个错误,感谢@EdwardvanKuik在评论中指出这一点
0lvr5msh3#
这是不可能的:
kt06eoxx4#
所有重复行中的任何索引列都可能包含NULL,因为NULL既不等于也不等于NULL,因此索引值不被视为相等,并允许继续。
请参阅here示例和(可能的)解决方法(尝试强制唯一行)。