MySQL - 尝试添加新列时出现重复输入错误

Han*_*ank 16 mysql alter-table

我有一个MySQL数据库,其表有200万行使用innodb引擎.我想添加另一列,但我一直收到以下错误:

Error 1062: Duplicate entry '' for key 'PRIMARY' SQL Statement: ALTER TABLE `mydb`.`table`  ADD COLUMN `country` VARCHAR(35) NULL DEFAULT NULL AFTER `email` 
Run Code Online (Sandbox Code Playgroud)

如何在不收到此错误的情况下添加列?

编辑:表定义

id int(11) NOT NULL AUTO_INCREMENT,   
user_id varchar(45) NOT NULL,   
first_name varchar(150) DEFAULT NULL,   
last_name varchar(150) DEFAULT NULL,   
gender varchar(10) DEFAULT NULL,   
email varchar(100) DEFAULT NULL,   
created_at bigint(20) DEFAULT NULL,   
updated_at bigint(20) DEFAULT NULL,  
PRIMARY KEY (`id`,`user_id`),   
UNIQUE KEY `user_id_UNIQUE` (`user_id`),   
KEY `first_name` (`first_name`),   
KEY `last_name` (`last_name`)
Run Code Online (Sandbox Code Playgroud)

编辑#2: SHOW INDEXES输出

Table       Non_unique  Key_name        Seq_in_index  Column_name     Collation  Cardinality Index_type
table       0           PRIMARY         1             id              A          3516446     BTREE      
table       0           PRIMARY         2             user_id         A          3516446     BTREE
table       0           user_id_UNIQUE  1             user_id         A          3516446     BTREE
table       1           first_name      1             first_name      A          390716      BTREE  
table       1           last_name       1             last_name       A          439555      BTREE
Run Code Online (Sandbox Code Playgroud)

小智 18

文档中所述,运行在线ALTER TABLE操作时:

...运行 ALTER TABLE 操作的线程将应用 DML 操作的“在线日志”,这些操作是从其他连接线程在同一表上并发运行的。应用 DML 操作时,可能会遇到重复键条目错误(ERROR 1062 (23000): Duplicate entry),即使重复条目只是临时的,并且会被“在线日志”中的后续条目还原. 这类似于 InnoDB 中的外键约束检查的想法,其中约束必须在事务期间保持。


小智 10

它解决方案会锁定写入表,但如果表不是很大,通常适合解决问题

LOCK TABLES my_table WRITE;

ALTER TABLE my_table 
ADD COLUMN `ts` DATETIME NULL AFTER `id`;

UNLOCK TABLES;
Run Code Online (Sandbox Code Playgroud)


Jān*_*ris 8

如果它不是程序需要做的事情(动态地改变表),那么稍等片刻然后再试一次!它对我有用.:)我猜有一些特定于InnoDB的进程/状态(可能还在处理刚刚查询的另一个ALTER?),在此期间ALTER命令会失败,你只需要抓住它成功的时刻.

  • 我有同样的问题,并等待一个长时间运行的过程结束帮助,所以它可能是一个错误的错误消息的锁定问题. (2认同)

Ste*_*gin 1

我运行了相同的代码并且运行良好。 http://sqlfiddle.com/#!2/1937e

作为解决方案,我会尝试重新创建表,将数据复制到其中,然后使用重命名切换表。

  • 如果这不起作用,那么很明显这是您当前 mysql 配置的错误,我们需要更多详细信息来找出它或至少重现它(mysql 版本、mysql 配置、数据库设置、实际数据等) .)。
  • 如果它有效,那么可能是表或索引有问题,您可以检查以下一些内容(如果您不想重新创建表,也可以从这些开始):
    1. 检查是否有任何触发器导致其他插入
    2. 检查您是否只是创建列而不添加其他键/索引
    3. 检查 auto_increment 值是否溢出(对于 int,它超过 2,000,000,000)

如果以上都不是,那么您可能有一些损坏的数据,或者您错过了分享一些详细信息。