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)
小智 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)
如果它不是程序需要做的事情(动态地改变表),那么稍等片刻然后再试一次!它对我有用.:)我猜有一些特定于InnoDB的进程/状态(可能还在处理刚刚查询的另一个ALTER?),在此期间ALTER命令会失败,你只需要抓住它成功的时刻.
我运行了相同的代码并且运行良好。 http://sqlfiddle.com/#!2/1937e
作为解决方案,我会尝试重新创建表,将数据复制到其中,然后使用重命名切换表。
如果以上都不是,那么您可能有一些损坏的数据,或者您错过了分享一些详细信息。