MariaDB 10.4.21为已有表添加主键时报错“Incorrect index name 'pk_i_id'”
问题原因
这是MariaDB与MySQL的索引处理逻辑差异导致的,仅在MariaDB 10.2及以上版本会触发:
- 执行第一条ALTER语句添加
pk_i_id字段时,你指定了UNIQUE约束,MariaDB会自动为该字段创建与字段同名的唯一约束索引pk_i_id。 - InnoDB引擎规定主键索引的名称固定为
PRIMARY,不允许自定义。当执行添加主键的语句时,MariaDB检测到目标列上已经存在一个名为pk_i_id的唯一约束索引,无法直接将其转换为必须命名为PRIMARY的主键索引,因此抛出Incorrect index name 'pk_i_id'错误。 - MySQL 5.7的处理逻辑更宽松,会自动删除字段上的同名唯一索引后再创建主键,因此可以正常执行。
解决方法
有两种可行的修复方案:
方案1:移除多余的UNIQUE约束(最推荐)
主键本身自带非空、唯一约束,不需要额外添加UNIQUE属性。调整第一条ALTER语句,将UNIQUE替换为普通索引即可,既满足InnoDB对AUTO_INCREMENT列必须属于索引首列的要求,也不会生成冲突的唯一约束索引:ALTER TABLE /*TABLE_PREFIX*/t_mmessenger_recipients ADD `pk_i_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT FIRST, ADD INDEX(`pk_i_id`);后续的ALTER语句不需要修改,即可正常执行。
方案2:添加主键前先删除同名唯一索引
如果不想修改原有第一条ALTER语句,可以在删除原有主键后、添加新主键前,新增一条删除同名唯一索引的语句即可:ALTER TABLE /*TABLE_PREFIX*/t_mmessenger_recipients ADD `pk_i_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE FIRST; ALTER TABLE /*TABLE_PREFIX*/t_mmessenger_recipients DROP FOREIGN KEY `fk_/*TABLE_PREFIX*/t_mmessenger_recipients_message`; ALTER TABLE /*TABLE_PREFIX*/t_mmessenger_recipients DROP PRIMARY KEY; -- 新增此行删除自动生成的同名唯一索引 ALTER TABLE /*TABLE_PREFIX*/t_mmessenger_recipients DROP INDEX `pk_i_id`; ALTER TABLE /*TABLE_PREFIX*/t_mmessenger_recipients ADD PRIMARY KEY (`pk_i_id`); ALTER TABLE /*TABLE_PREFIX*/t_mmessenger_recipients ADD CONSTRAINT `fk_/*TABLE_PREFIX*/t_mmessenger_recipients_message` FOREIGN KEY(`message_id`) REFERENCES /*TABLE_PREFIX*/t_mmessenger_message(`id`) ON UPDATE CASCADE ON DELETE CASCADE;
内容的提问来源于stack exchange,提问作者Turbo
相关产品推荐
相关产品推荐

