- MySQL中,添加联合主键时,执行SQL语句时,报错:
ERROR 1075: Incorrect table definition; there can be only one auto column and it must be defined as a key
。- 以下是我遇到的问题场景,其他同学场景基本上都类似(涉及到自增列),可以直接跳到“解决方法”部分阅读,查看该问题发生的本质原因以及解决方法。
1、问题发生场景
- 如下数据表中,将原主键
module_id
删除,将module_type
+fund_line_id
设置为联合主键
,如下图中的1 - 原主键
module_id
保留 Auto Increment(自增)属性,如下图中的2
- 执行该操作(即执行如下sql语句),将会报错:
ERROR 1075: Incorrect table definition; there can be only one auto column and it must be defined as a key
。ALTER TABLE `AAAAA` DROP PRIMARY KEY, ADD PRIMARY KEY (`module_type`, `fund_line_id`);
2、解决方法
MySQL发生1075错误是因为,数据库中设置了自增列(auto-Incrementing column),但未将其设置为PRIMARY KEY
或UNIQUE KEY
,导致执行脚本失败。所以,针对该问题的解决方法:
- 方法1:将
自增列(auto-Incrementing column)
设置为主键(PRIMARY KEY)
; - 方法2:如果不将
自增列
设置为主键,可将其设置为 唯一索引UNIQUE KEY
也可解决该问题;
针对于,自己上诉的场景,我采用了以下三种解决方法(其中第三种方法不推荐使用):
-
方法1:去除原主键(module_id)的
PRIMARY KEY
属性,添加module_type
和fund_line_id
为联合主键
,并将module_id设置为UNIQUE KEY
(唯一索引), 即:如下sql语句ALTER TABLE `AAAAA` DROP PRIMARY KEY, ADD PRIMARY KEY (`module_type`, `fund_line_id`), ADD UNIQUE KEY (module_id);
-
方法2:保留module_id的
PRIMARY KEY
属性,添加module_type
和fund_line_id
为 **UNIQUE KEY(唯一索引)
**即:如下sql语句ALTER TABLE `AAAAA` CHANGE COLUMN `module_type` `module_type` INT(11) NOT NULL , CHANGE COLUMN `fund_line_id` `fund_line_id` INT(11) NOT NULL , ADD UNIQUE KEY (`module_type`, `fund_line_id`);
-
方法3(不推荐):去除原主键(module_id)的
PRIMARY KEY
属性,添加module_type
和fund_line_id
为联合主键
,并去除module_id的auto-Incrementing
属性, 即:如下sql语句ALTER TABLE `AAAAA` CHANGE COLUMN `module_id` `module_id` INT(11) NOT NULL , DROP PRIMARY KEY, ADD PRIMARY KEY (`module_type`, `fund_line_id`);
3、参考
- 【Stack Overflow – MySQL: #1075 - Incorrect table definition; autoincrement vs another key?】
- 【优快云 – 解决:Incorrect table definition;there can be only one auto column and it must be defined as a key报错】
- 【Fix MySQL ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key】