如何在INSERT INTO SELECT语句中为插入数据设置默认值?
问题根源
你当前的写法不生效有两个核心原因:
- 执行
insert into #Resultt select * from #Result时,SQL会按列的物理顺序对应赋值:目标表第一列是case_status,源表第一列是pk_id,相当于直接把源表的主键值塞到了case_status列,自然不会触发你设置的默认值,其余列的对应也完全错位。 - 目标表的
pk_id带有IDENTITY属性,默认禁止手动插入指定值,如果需要保留源表的pk_id数值,需要先开启对应权限。
正确实现方案
方案1:使用已设置的case_status默认值
如果你要保留表结构里的DEFAULT 1配置,只需指定插入列,跳过case_status即可触发默认值,同时处理IDENTITY列的插入权限:
-- 开启目标表IDENTITY列手动插入权限 SET IDENTITY_INSERT #Resultt ON; -- 明确指定插入的列,不包含case_status,会自动填充默认值1 INSERT INTO #Resultt (pk_id, fk_customer_id, fk_vehicle_id, relation_type, end_date) SELECT pk_id, fk_customer_id, fk_vehicle_id, relation_type, end_date FROM #Result; -- 用完关闭权限 SET IDENTITY_INSERT #Resultt OFF;
方案2:显式指定case_status固定值
如果不想依赖默认值配置,或者后续需要灵活修改这个固定值,可以直接在查询语句里加常量1:
SET IDENTITY_INSERT #Resultt ON; INSERT INTO #Resultt (case_status, pk_id, fk_customer_id, fk_vehicle_id, relation_type, end_date) SELECT 1 AS case_status, pk_id, fk_customer_id, fk_vehicle_id, relation_type, end_date FROM #Result; SET IDENTITY_INSERT #Resultt OFF;
可选:不需要保留源表pk_id的简化写法
如果目标表的pk_id不需要和源表一致,允许目标表自行生成IDENTITY值,可以不用处理IDENTITY_INSERT权限,写法更简单:
INSERT INTO #Resultt (case_status, fk_customer_id, fk_vehicle_id, relation_type, end_date) SELECT 1, fk_customer_id, fk_vehicle_id, relation_type, end_date FROM #Result;
内容的提问来源于stack exchange,提问作者Can
相关产品推荐
相关产品推荐

