MySQL不允许一张表有多个主键,需检查建表语句中PRIMARY KEY出现次数,确保仅保留一个;复合主键须用PRIMARY KEY(col1,col2)统一声明,多字段唯一应改用UNIQUE约束。
直接删掉重复的定义,只保留一个 —— MySQL 不允许一张表有多个主键,语法上就过不去。
检查建表语句里写了几个
这是最常见也最容易忽略的源头。比如你写了:
MySQL 解析时会逐字段读取约束,遇到第一个
就记下,再遇到第二个就直接报
。它不等你写完括号,解析到第二个就终止。
复合主键必须写在表定义末尾,用
形式统一声明
不能对两个字段分别加
,哪怕它们逻辑上都“唯一”也不行
如果想让多个字段都唯一,改用
约束,例如
用
查当前实际结构
DDL 语句没写错,但表已经存在且带主键,你又执行了另一条加主键的
,也会触发该错误。这时候不是语法问题,而是运行时冲突。
MySQL(Linux)
MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。
下载
先运行
,看输出里是否已有
行
或者查数据字典:
确认存在后,必须先
,再执行新加逻辑
注意:如果原主键含
,得先
字段去掉自增,否则
会失败
工具导出/同步时自动补主键导致重复
DbVisualizer、DBeaver、Navicat 或 otter 同步任务,在“重建表”或“迁移结构”时可能默认把某列当主键加回去,而目标表已有主键,就会在生成的 SQL 中出现两个
。
不要直接运行工具生成的完整 DDL,先人工检查
或
语句
重点盯
出现次数和位置,尤其注意括号外的独立声明
如果是同步场景(如 otter 报错日志里出现
),优先查目标库表是否已存在主键,而不是改源端
临时解决可加
?不行 —— MySQL 的
不支持这个子句,必须显式判断并处理
真正容易被绕开的点是:你以为自己只定义了一次主键,但可能是建表语句 + 后续
+ 工具自动补全三者叠加;只要最终 SQL 文本里
字符串出现超过一次,MySQL 就会拒绝执行。
PRIMARY KEYPRIMARY KEYCREATE TABLE bookorder (
m_id CHAR(6) PRIMARY KEY,
b_id CHAR(7) PRIMARY KEY
);PRIMARY KEY[Err] 1068 - Multiple primary key definedPRIMARY KEY(col1, col2)PRIMARY KEYUNIQUEm_id UNIQUE, b_id UNIQUESHOW CREATE TABLEALTER TABLE ... ADD PRIMARY KEYSHOW CREATE TABLE your_table;PRIMARY KEYSHOW KEYS FROM your_table WHERE Key_name = 'PRIMARY';ALTER TABLE your_table DROP PRIMARY KEY;AUTO_INCREMENTMODIFYDROP PRIMARY KEYPRIMARY KEYCREATE TABLEALTER TABLEPRIMARY KEYMultiple primary key definedIF NOT EXISTSADD PRIMARY KEYALTERPRIMARY KEY