DBeaver导入时默认跳过自增主键列,必须勾选“Transfer auto-generated columns”才能写入源数据中的主键值;导出时需同步勾选“Include generated column”,否则导入无主键字段可传。

导入时默认会跳过自增主键列,想保留或写入值,必须显式控制「Transfer auto-generated columns」选项。
导入前必须勾选 Transfer auto-generated columns
DBeaver 在执行数据导入(如从 CSV、SQL 文件或另一张表)时,Transfer auto-generated columns 默认是关闭的。这意味着即使源数据里有 id 值,只要目标列定义为 GENERATED ALWAYS AS IDENTITY(DB2)、SERIAL(PostgreSQL)或 AUTO_INCREMENT(MySQL),DBeaver 就会主动忽略该列,不传值、不插入、不更新——哪怕你导出时特意保留了它。
解决办法很简单:在导入向导最后一步(“Data transfer settings” 或 “Load settings” 页面),找到并勾选 Transfer auto-generated columns。
- 勾选后:源数据中的主键值会被原样写入目标列,数据库不会报“cannot insert into generated column”类错误
- 不勾选:DBeaver 自动过滤掉该列,由数据库按规则生成新值(比如 MySQL 插入
NULL触发自增) - 注意:该选项对 PostgreSQL 的
SERIAL和IDENTITY列均生效;对 MySQL 的AUTO_INCREMENT列也有效,但需确保目标列允许显式插入(即未设NO_AUTO_VALUE_ON_ZERO等限制)
Truncate target table 与主键重置的关系
如果目标表已有数据,且你勾选了 Truncate target table(s) before load,那不仅清空数据,还会重置自增计数器(MySQL 的 AUTO_INCREMENT 值归零或回到最小值,PostgreSQL 的序列当前值被重置,DB2 的 IDENTITY 也会重置)。
这直接影响后续插入行为:
- 若你导入的数据含主键
1,2,3,又勾选了Truncate,那导入能成功;但之后再插新记录,可能从1开始冲突(尤其当没勾选Transfer auto-generated columns) - 若你只想追加数据、不重置计数器,就一定不能勾选
Truncate target table(s) before load,同时确认Replace method设为INSERT或INSERT IGNORE(依数据库支持而定) - DB2 用户额外注意:
TRUNCATE本身不触发触发器,但会重置IDENTITY,这点和DELETE + RESTART IDENTITY效果一致
不同数据库对主键列的兼容处理差异
同一勾选项,在不同数据库底层行为并不完全等价:
- MySQL:
Transfer auto-generated columns实际是让 DBeaver 在 INSERT 语句中显式写出主键字段和值(如INSERT INTO t(id,name) VALUES(100,'a')),前提是表未启用sql_mode=STRICT_TRANS_TABLES等强约束 - PostgreSQL:勾选后,DBeaver 会绕过
GENERATED ALWAYS限制,用OVERRIDING SYSTEM VALUE语法强制写入(仅限IDENTITY列);对老式SERIAL,本质仍是写入序列值,无需特殊语法 - DB2:勾选后等效于在 INSERT 中使用
FOR BIT DATA或直接传值,但要求列定义为GENERATED BY DEFAULT AS IDENTITY(而非ALWAYS),否则仍会报错
所以别只看 DBeaver 界面选项——得核对目标列的实际定义,尤其是 GENERATED ALWAYS 还是 GENERATED BY DEFAULT,这个细节常被忽略,一导就失败。
导出时 Include generated column 是导入成功的前提
如果你是从 DBeaver 导出再导入(比如迁移场景),那导出阶段就得为导入铺路:必须在导出设置里勾选 Include generated column。否则导出的 SQL 文件里压根不包含主键列,导入时自然无值可传,Transfer auto-generated columns 再怎么开也没用。
验证方法很简单:导出后打开 SQL 文件,搜索 INSERT INTO,看语句里是否含主键字段名(如 INSERT INTO user(id, name))。没有,说明导出配置漏了。
另外,导出时若用了「Insert statement」格式而非「Plain INSERT」,某些版本 DBeaver 可能自动省略主键——此时建议手动切到 Plain INSERT 模式再试一次。

















