• 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 KEYUNIQUE KEY,导致执行脚本失败。所以,针对该问题的解决方法:

  • 方法1:将自增列(auto-Incrementing column)设置为主键(PRIMARY KEY)
  • 方法2:如果不将自增列设置为主键,可将其设置为 唯一索引UNIQUE KEY也可解决该问题;

针对于,自己上诉的场景,我采用了以下三种解决方法(其中第三种方法不推荐使用):

  • 方法1:去除原主键(module_id)的PRIMARY KEY属性,添加module_typefund_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_typefund_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_typefund_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、参考

  1. 【Stack Overflow – MySQL: #1075 - Incorrect table definition; autoincrement vs another key?】
  2. 【CSDN – 解决:Incorrect table definition;there can be only one auto column and it must be defined as a key报错】
  3. 【Fix MySQL ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key】
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐