达梦数据库默认不允许直接向自增列插入值。
解决方案
您可以根据具体情况,参考以下表格选择并实施合适的解决方案:
| 解决方案 |
核 心思路 | 适用场景与操作提示 |
|---|---|---|
| 启用 IDENTITY_INSERT | 临时开启设置,允许手动插入自增列值。 | 需要保留插入语句中的自增列值(如数据迁移、备份恢复)。需确保: • 在插入语句前后分别执行 ON 和 OFF。• 必须在INSERT语句中明确列出所有列名。 |
| 修改 INSERT 语句 | 从INSERT语句中移除自增列及其值。 | 不关心插入的具体自增值,交由数据库自动生成。这是推荐的做法,一劳永逸。 |
| 修改表结构(慎用) | 直接移除表的自增属性。 | 确定不再需要自增特性,且后续会完全手动管理主键。此操作不可逆,需谨慎评估。 |
启用 IDENTITY_INSERT 示例
如果确定需要手动插入自增列的值,请按以下格式修改您的SQL文件或执行语句:
sql
-- 开启手动插入。请将 "模式名.表名" 替换为您的实际表名 SET IDENTITY_INSERT "模式名"."表名" ON; -- 您的原始INSERT语句,必须指定所有列名 INSERT INTO 表名 (id, 其他列...) VALUES (具体值, ...); -- 可以有多条INSERT语句 -- 关闭手动插入 SET IDENTITY_INSERT "模式名"."表名" OFF; COMMIT; -- 提交事务:cite[3]
注:
SET IDENTITY_INSERT的设置是会话级别的,连接断开后会自动还原为OFF。一个会话中只能有一个表的此属性为ON。
修改 INSERT 语句示例
这是最简单且推荐的方法,只需调整您的INSERT语句,忽略自增列:
sql
-- 原语句(会报错):
-- INSERT INTO your_table (id, name, age) VALUES (1, '张三', 25);
-- 修改后(正确):
INSERT INTO your_table (name, age) VALUES ('张三', 25);
-- 让数据库自动为id列生成值:cite[6]
一个重要的提醒
在达梦数据库中,SET IDENTITY_INSERT 是一个会话级的设置。这意味着:
-
它只在当前的数据库连接中有效。
-
一旦您关闭了当前连接(例如,关闭了SQL工具或中断了命令行会话),这个设置就会自动失效,恢复为默认的
OFF状态。 -
因此,如果您是通过一个脚本或程序来执行这些SQL,需要确保在同一连接会话中完成
ON、插入、OFF这一系列操作。
1908

被折叠的 条评论
为什么被折叠?



