You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

执行SQL插入时报错:显式标识列不允许DEFAULT和NULL值

报错触发原因
  • 目标表A的id字段是IDENTITY类型的自增标识列,这类列由数据库在数据插入时自动生成递增的非空唯一值,默认不允许手动写入NULL或DEFAULT值。
  • 你当前编写的SQL在插入字段列表中显式指定了id列,同时在SELECT映射的取值中为id传入了NULL,直接违反了标识列的写入约束,因此抛出该错误。
调整方案

根据实际业务需求选对应方案即可:

方案1:使用自增列自动生成的值(绝大多数场景适用)

不需要手动给id传值,直接把插入字段列表里的id、以及SELECT子句中对应的NULL id片段删除即可,数据库会自动为每一条插入的记录生成合法的id值,调整后的SQL如下:

insert into A  (name,version,date_execution,db_user)
select  'Suite UC',
       '3.7.08' version,
       GETDATE() heure, 
       name as login
  from sys.server_principals
 where type_desc ='SQL_LOGIN'
   and is_disabled = 0 ;

方案2:需要手动写入指定id值(如数据迁移场景)

如果确实需要手动指定id的取值(不能传NULL,必须传入不重复的合法整数值),需要先在当前会话开启表的标识列插入权限,插入完成后及时关闭该权限,示例写法如下:

-- 开启标识列手动写入权限
SET IDENTITY_INSERT A ON;

-- 插入语句,注意id必须传入明确的非空整数值,不能写NULL
insert into A  (id,name,version,date_execution,db_user)
select  ROW_NUMBER() OVER(ORDER BY name) + 1000 as id,
       'Suite UC',
       '3.7.08' version,
       GETDATE() heure, 
       name as login
  from sys.server_principals
 where type_desc ='SQL_LOGIN'
   and is_disabled = 0 ;

-- 插入完成后关闭权限,避免影响后续其他写入操作
SET IDENTITY_INSERT A OFF;

注意:方案2仅适用于必须手动指定id的特殊场景,常规业务写入优先使用方案1,不要随意开启IDENTITY_INSERT配置。

内容的提问来源于stack exchange,提问作者hamza lamkadam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 17:45:38