You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何向含数据的MariaDB表加键?MySQL添加唯一键报错#1062解决方法

关于MariaDB/MySQL表添加键及ALTER报错的解决方案

让我来逐个帮你解决这两个问题:

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是唯一键,但表中doctermblogid这三个列的组合已经存在重复行(比如至少有两行的doc=5009term=daringblogid=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

火山引擎 最新活动