Navicat不支持一键为多表加主键,须用SQL脚本:MySQL需ALTER TABLE同时设NOT NULL、PRIMARY KEY和AUTO_INCREMENT;PostgreSQL需建序列、绑定默认值、设NOT NULL、加主键并OWNED BY关联。

Navicat 本身不提供“一键为多张表加主键”的功能,必须依赖 SQL 脚本 + 数据库原生命令完成;直接在图形界面点选多张表右键操作,没有「添加主键」选项。
MySQL:先确认列存在,再用 ALTER TABLE 一次性设 NOT NULL + 主键 + AUTO_INCREMENT
很多翻车源于只执行 MODIFY id INT AUTO_INCREMENT,却漏掉 NOT NULL 和 PRIMARY KEY。MySQL 要求三者必须同时满足才能成功。
- 目标列(如
id)必须已存在,且类型为整型(INT、BIGINT),不能是VARCHAR或TEXT - 若表已有数据,需先补全该列值(比如用
UPDATE t SET id = (@i := @i + 1) ORDER BY created_at;初始化) - 执行单条语句完成全部动作:
ALTER TABLE users MODIFY id BIGINT NOT NULL AUTO_INCREMENT FIRST, ADD PRIMARY KEY (id); - 注意:加完后
SHOW CREATE TABLE users中的AUTO_INCREMENT值默认为当前最大值 + 1;若要指定起始值,得显式写AUTO_INCREMENT = 1000
PostgreSQL:建序列 → 绑定默认值 → 设 NOT NULL → 加主键 → 关联 OWNED BY
PostgreSQL 没有 AUTO_INCREMENT,靠序列(SEQUENCE)模拟自增。漏掉任何一步都可能导致后续 DROP TABLE 留下孤立序列,或插入时报错。
- 序列名建议带表前缀,如
users_id_seq,避免重名冲突 -
ALTER COLUMN id SET DEFAULT必须写完整:nextval('users_id_seq'::regclass),不能省略类型转换 - 若原列允许
NULL,必须先执行ALTER COLUMN id SET NOT NULL,否则加主键失败 -
OWNED BY是关键:它让序列与列绑定,确保pg_dump能正确导出依赖关系
批量脚本里怎么安全跳过已设主键的表
写 Python 或 shell 脚本遍历几十张表时,重复执行会报错中断。必须提前查系统表判断是否已有主键,再决定是否执行建主键逻辑。
- MySQL 查
INFORMATION_SCHEMA.KEY_COLUMN_USAGE,过滤CONSTRAINT_NAME = 'PRIMARY' - PostgreSQL 查
pg_constraint,条件是contype = 'p'且conrelid::regclass::text = 'table_name' - 不要依赖 Navicat 的“设计表”界面状态——它只是缓存,可能滞后于实际 DDL 变更
- 建议在脚本中对每张表先执行一次
SELECT COUNT(*) FROM ...验证主键是否存在,比拼 SQL 字符串更可靠
最易被忽略的是字段类型兼容性:比如想把 INT UNSIGNED 改为主键,但目标列其实是 TINYINT,MySQL 会静默截断或报错 1075。动手前务必用 DESCRIBE table_name 或 \d table_name 看清原始定义。


















