如何向含数据的MariaDB表加键?MySQL添加唯一键报错#1062解决方法
让我来逐个帮你解决这两个问题:
1. 向已有数据的MariaDB表中添加键的方法
根据你要添加的键的类型,操作方式略有不同,同时要注意已有数据的合法性:
添加主键:
首先确认要设为主键的列(或组合列)没有重复值和NULL值,然后执行:ALTER TABLE your_table_name ADD PRIMARY KEY (column_name);如果存在重复或NULL,必须先清理数据(比如删除重复行、填充NULL为有效值),再执行上述语句。
添加唯一键:
唯一键要求列(或组合列)的所有值都是唯一的,所以先检查目标列组合有没有重复数据,确认没问题后执行:ALTER TABLE your_table_name ADD UNIQUE KEY key_name (column1, column2);若有重复,先处理重复数据再添加。
添加普通索引(非唯一键):
普通索引仅用于加速查询,不限制数据唯一性,直接执行即可:ALTER TABLE your_table_name ADD INDEX index_name (column1, column2);
2. 解决ALTER语句报错#1062 - Duplicate entry '5009-daring-1' for key 'doctermitem'
这个报错的核心原因是:你要添加的doctermitem是唯一键,但表中doc、term、blogid这三个列的组合已经存在重复行(比如至少有两行的doc=5009、term=daring、blogid=1),违反了唯一键的约束规则。
按照以下步骤解决:
第一步:定位重复数据
先执行这条查询,找出所有doc+term+blogid组合重复的行:
SELECT doc, term, blogid, COUNT(*) AS duplicate_count FROM wpi4_asp_index GROUP BY doc, term, blogid HAVING COUNT(*) > 1;
执行后你会看到所有重复的组合以及它们的重复次数。
第二步:处理重复数据
根据你的业务需求选择以下方式:
删除重复行(保留一行):
假设表有自增主键id,你可以保留id最小的行,删除其他重复行:DELETE t1 FROM wpi4_asp_index t1 JOIN wpi4_asp_index t2 ON t1.doc = t2.doc AND t1.term = t2.term AND t1.blogid = t2.blogid WHERE t1.id > t2.id;如果没有
id列,可以用其他唯一标识字段(比如创建时间created_at)来保留需要的行。修改重复值:
如果这些重复行是业务上合法存在的,那你要么调整唯一键的定义(比如去掉某个列,或者把唯一键改成普通索引),要么修改重复行的某个列值,让doc+term+blogid的组合不再重复。
第三步:重新执行ALTER语句
处理完重复数据后,再次运行你的ALTER语句即可:
ALTER TABLE `wpi4_asp_index` ADD UNIQUE KEY `doctermitem` (`doc`,`term`,`blogid`), ADD KEY `term_ptype_bid_lang` (`term`(20),`post_type`(20),`blogid`,`lang`(10)), ADD KEY `rterm_ptype_bid_lang` (`term_reverse`(20),`post_type`(20),`blogid`,`lang`(10));
另外提个小技巧:如果想先添加另外两个普通索引(它们不限制唯一性,不会报错),可以把添加唯一键的语句单独拆分出来,等处理完重复数据后再执行。
内容的提问来源于stack exchange,提问作者kealaxshan




