执行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
相关产品推荐
相关产品推荐

