直接执行alter table add primary key(id)大概率失败,因id列存在null值或重复值;必须先查重复、查空值、确认列定义为not null,再修复数据并显式添加非空约束,最后加主键。

直接执行 ALTER TABLE table_name ADD PRIMARY KEY (id) 大概率失败,核心原因就两个:字段含 NULL 值,或存在重复值。
为什么加主键总报 Duplicate entry 或 Column cannot be null?
MySQL 在添加主键前会全表扫描校验——不是只看“当前有没有空/重”,而是严格按列定义 + 全部数据双重判断。
-
Duplicate entry 'X' for key 'PRIMARY':说明id列有重复值,哪怕只有一对也拦停 -
Column 'id' cannot be null:说明该列允许NULL(即建表时没写NOT NULL),即使现在所有行都不为空也不行 - 别信“我查过没 NULL”,
SHOW COLUMNS FROM table_name LIKE 'id'看Null列是否为YES才算数
加主键前必须做的三步检查与修复
顺序不能错,少一步都可能卡在中途:
- 查重复:
SELECT id, COUNT(*) FROM table_name GROUP BY id HAVING COUNT(*) > 1 - 查空值:
SELECT * FROM table_name WHERE id IS NULL - 确认列定义:
SHOW COLUMNS FROM table_name LIKE 'id',确保Null列显示NO
修复方式按业务定:删重复行、UPDATE ... SET id = UUID_SHORT() 生成新值、或用 ALTER TABLE ... MODIFY COLUMN id INT NOT NULL 补非空(注意类型兼容性)。
联合主键的特殊限制
用 ALTER TABLE table_name ADD PRIMARY KEY (a, b) 时,MySQL 要求:a 和 b 都必须已定义为 NOT NULL,且组合值全局唯一。
- 哪怕
a不为空、b有NULL,也会失败 - 删联合主键只能用
ALTER TABLE table_name DROP PRIMARY KEY,不能只删其中一列 - 加完后,
INSERT INTO table_name (a) VALUES (1)会报错——因为b没给值又不允许NULL
加了主键,为什么 INSERT 不填 ID 还报 Field 'id' doesn't have a default value?
主键 ≠ 自增。这是两个独立机制:
-
PRIMARY KEY只管唯一 + 非空 -
AUTO_INCREMENT是额外属性,必须显式加上 - 想省略
id插入,得补一句:ALTER TABLE table_name MODIFY COLUMN id INT NOT NULL AUTO_INCREMENT
最容易被忽略的是:加自增前,该列必须已是主键或唯一键;而且每个表只能有一个 AUTO_INCREMENT 字段。











