主键字段必须显式声明AUTO_INCREMENT才生效;Navicat勾选“自增”仅为UI提示,实际依赖SQL层面定义;该字段须为整数类型、唯一索引(通常为主键)、且全表仅能有一个。
主键字段必须显式声明 AUTO_INCREMENT 才生效
navicat 界面里勾选“自增”只是 ui 提示,真正起作用的是 mysql 的 auto_increment 属性。如果建表时没在 sql 层面加上这个关键字,哪怕 navicat 显示对勾,插入数据也不会自增。
常见错误现象:ERROR 1075: Incorrect table definition; there can be only one auto column and it must be defined as a key —— 这说明你试图给非主键字段加 AUTO_INCREMENT,或者主键没设成 PRIMARY KEY。
- 主键字段类型必须是整数类(
TINYINT、INT、BIGINT),VARCHAR或UUID不行 - 一个表只能有一个
AUTO_INCREMENT字段,且必须是索引的一部分(通常是PRIMARY KEY或UNIQUE KEY) - Navicat 新建表时,在“字段”页签右键列 → “设置为主键” + 勾选“自动递增”,等价于生成
id INT PRIMARY KEY AUTO_INCREMENT
修改已有表添加自增主键要分两步走
直接对已有字段执行 ALTER TABLE t1 MODIFY id INT AUTO_INCREMENT 很可能失败,尤其当该字段已存在数据但没设主键时。MySQL 要求 AUTO_INCREMENT 字段必须有索引约束,而修改过程不会自动补上。
使用场景:历史表没有主键,现在想补上 id 并让它自增。
- 先加主键:
ALTER TABLE t1 ADD PRIMARY KEY (id)(前提是id值不重复且无 NULL) - 再加自增:
ALTER TABLE t1 MODIFY id INT AUTO_INCREMENT - 如果
id已有数据但不连续,MySQL 会从当前最大值 +1 开始计数,不是重排 - 若原字段是
INT UNSIGNED,修改时也得带上UNSIGNED,否则报错ERROR 1067: Invalid default value for 'id'
Navicat 设计表时容易漏掉的三个配置点
界面操作看似简单,但三个关键项不手动确认,后期插入或同步就出问题。
-
Auto Increment勾选后,还得点开“高级”选项卡,检查Start Value是否符合预期(默认是 1,但迁移数据时可能需要设为 10001) -
Collation对主键无效,但如果你误把VARCHAR当主键设了自增,Navicat 不拦,MySQL 建表时直接报错 - 导出 SQL 时注意勾选
Include AUTO_INCREMENT value,否则用该 SQL 在新库重建表,自增值会从 1 重新开始
自增 ID 溢出和重置风险得提前防
INT 类型上限是 2147483647,一旦插满就会报错 ERROR 1467: Failed to read auto-increment value from storage engine。这不是 Navicat 的锅,但很多人在它界面里看不出容量预警。
- 查当前最大值和自增起点:
SELECT AUTO_INCREMENT FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'your_db' AND TABLE_NAME = 'your_table' - 重置自增值不能只靠
ALTER TABLE t1 AUTO_INCREMENT = 100,如果表里已有 >=100 的 ID,下次插入仍会用更大值 - 真正安全的重置方式是先清空表:
TRUNCATE TABLE t1(会重置自增计数器),但注意这会删数据且不可回滚 - 长期项目建议主键用
BIGINT,别省那 4 字节——溢出修复成本远高于初始选型多敲几个字母
自增列不是“设完就完事”的开关,它是和存储引擎、插入行为、备份恢复强绑定的机制。Navicat 只负责生成 SQL,最终是否生效、怎么生效,全看 MySQL 底层认不认那条 AUTO_INCREMENT。










