1. 问题背景与现象分析
最近在项目中遇到一个关于数据库主键自增的有趣问题:同样的代码在开发环境和测试环境表现不一致。开发环境运行正常,而测试环境却抛出异常。具体场景是使用MyBatis-Plus框架,实体类ID字段标注了@TableId(type = IdType.ASSIGN_ID),表示由Java应用管理ID生成。
异常信息的关键部分是:"仅当指定列列表,且SET IDENTITY_INSERT为ON时,才能对自增赋值"。这个错误直接指向了数据库自增主键和Java应用自增ID之间的冲突。有趣的是,两个环境都配置了自增,为什么一个能正常工作,另一个却报错呢?
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 数据库自增机制深度解析
2.1 达梦数据库的两种自增实现方式
通过排查发现,达梦数据库(DM)实际上支持两种不同的自增实现方式:
-
主键自增(Identity列)
sql复制CREATE TABLE sys_bs_team_manage ( id INTEGER identity(1,1) primary key );这种方式的特征是:
- 使用
identity(start, increment)语法 - 在
all_tab_columns视图中identity_column显示为"YES" data_default为NULL- 底层实现为
GENERATED ALWAYS AS IDENTITY
- 使用
-
序列自增(Sequence)
sql复制CREATE SEQUENCE sys_bs_team_manage_seq; CREATE TABLE sys_bs_team_manage ( id INTEGER PRIMARY KEY DEFAULT sys_bs_team_manage_seq.NEXTVAL );这种方式的特征是:
- 显式创建SEQUENCE对象
- 列默认值设置为
sequence.NEXTVAL - 在
all_tab_columns视图中data_default显示具体的序列值
2.2 两种方式的底层差异
这两种方式看似都能
