直接执行alter table add primary key(id)大概率失败,根本原因是数据不满足主键非空且唯一的硬性条件;必须先查并修复重复值和null值,再显式声明not null,最后添加主键。

直接执行 ALTER TABLE table_name ADD PRIMARY KEY (id) 大概率失败,根本原因不是语法错,而是数据不满足主键的两个硬性条件:非空、唯一。
查重复值和 NULL 值是必须前置动作
MySQL 在加主键前会全表扫描校验,只要有一行不达标就中止并报错,比如 Duplicate entry 'X' for key 'PRIMARY' 或 Column 'id' cannot be null。不能跳过检查靠“感觉”判断。
- 查重复:
SELECT id, COUNT(*) FROM table_name GROUP BY id HAVING COUNT(*) > 1 - 查空值:
SELECT * FROM table_name WHERE id IS NULL - 修复方式要按业务定:删冗余行、用
UPDATE ... SET id = UUID_SHORT()生成新值(注意字段类型兼容)、或补具体业务 ID
NOT NULL 必须显式声明,不能依赖“当前没 NULL”
即使表里所有 id 值现在都不为 NULL,只要建表时没定义 NOT NULL,ALTER TABLE ... ADD PRIMARY KEY 仍会失败。MySQL 只看列定义,不看当前数据快照。
- 先执行:
ALTER TABLE table_name MODIFY COLUMN id INT NOT NULL - 再执行:
ALTER TABLE table_name ADD PRIMARY KEY (id) - 对
VARCHAR等类型同理,MODIFY语句里也得带上NOT NULL
联合主键要求更严格,所有参与列都必须 NOT NULL
比如想用 (user_id, order_time) 做联合主键,但 order_time 允许 NULL,就会直接报错。MySQL 不接受“组合里某一个为空但另一个不为空”的情况。
- 确认方式:
SHOW COLUMNS FROM table_name LIKE 'user_id'和SHOW COLUMNS FROM table_name LIKE 'order_time',两列的Null列都必须显示为NO - 删除联合主键只能整体删:
ALTER TABLE table_name DROP PRIMARY KEY,不能只删其中一个字段
加了主键 ≠ 自动自增,INSERT 时省略值会报 Field 'x' doesn't have a default value
主键约束和 AUTO_INCREMENT 是两个独立机制。加完主键后,如果还想插入时不填 id,必须额外启用自增:
ALTER TABLE table_name MODIFY COLUMN id INT NOT NULL AUTO_INCREMENT- 注意:每个表只能有一个
AUTO_INCREMENT字段,且必须是整数类型(INT/BIGINT) - 已有数据时,MySQL 会从 1 开始连续赋值;如需指定起始值,再单独执行:
ALTER TABLE table_name AUTO_INCREMENT = 1000
最容易被忽略的是:列定义里的 NOT NULL 和数据实际值是两回事,而 MySQL 只认前者。哪怕你刚用 UPDATE 把所有 NULL 补完了,只要没改列定义,加主键依然失败。











