MySQL添加多列全文索引失败:错误码1062重复条目问题
问题原因与解决方案
核心原因
InnoDB引擎的多列全文索引存在限制:不允许表中存在多行记录的所有索引列均为NULL的情况。当name和emailAddress同时为NULL时,这些行在全文索引中会被识别为完全相同的条目,触发1062重复键错误——哪怕删除了原有的唯一键,这个引擎层面的限制依然生效。而单列全文索引允许存在多个NULL值,所以不会出现报错。
解决步骤
排查并处理全NULL记录
先定位所有name和emailAddress都为NULL的行:SELECT id FROM emailarchive_people WHERE name IS NULL AND emailAddress IS NULL;你可以选择直接删除这些无意义的记录:
DELETE FROM emailarchive_people WHERE name IS NULL AND emailAddress IS NULL;或者给其中一列赋值(比如空字符串,注意空字符串与NULL不同,不会触发重复问题):
UPDATE emailarchive_people SET name = '' WHERE name IS NULL AND emailAddress IS NULL;重新创建多列全文索引
处理完数据后,执行原索引创建语句即可成功:ALTER TABLE `emailarchive_people` ADD FULLTEXT INDEX `personFT` (`name`,`emailAddress`);预防后续问题(可选)
为避免再次出现同类问题,可修改表结构,让至少一个索引列默认非空:ALTER TABLE emailarchive_people MODIFY COLUMN name varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
内容的提问来源于stack exchange,提问作者Mark Portbury
相关产品推荐
相关产品推荐

