SQL向新表插入数据时处理不可修改的非空列问题
问题根因
你当前的逻辑是先向Table2插入Column1、Column2两列数据,之后再更新Column3为0,但非空约束会在插入执行时就校验字段值,插入阶段Column3为空直接触发约束报错,后续的更新语句根本不会执行。
解决方案
直接在插入的SELECT查询中为Column3指定固定值,插入阶段就满足非空约束要求,不需要后续单独更新。
修正后代码
-- 筛选Table1中不存在于Table2的行,避免重复插入 IF EXISTS (SELECT T1.Column1, T1.Column2 FROM Table_1 T1 LEFT JOIN Table_2 T2 on T1.Column1=T2.Column1 WHERE T2.Column1 IS NULL) BEGIN INSERT INTO Table_2 (Column1, Column2, Column3) SELECT TOP(50) Column1, Column2, 0 AS Column3 FROM Table_1 T1 WHERE NOT EXISTS (SELECT 1 FROM Table_2 T2 WHERE T1.Column1 = T2.Column1) ORDER BY Column1 SELECT @@ROWCOUNT END IF @@ROWCOUNT < 50 BEGIN SELECT * FROM Table_2 END
优化说明
- 插入语句新增了Column3字段的赋值,直接写入你需要的默认值0,插入时即可满足非空约束,原后续的UPDATE语句可直接删除
- 补充了插入数据的去重筛选逻辑,和开头的EXISTS校验逻辑对齐,避免主键重复插入报错
内容的提问来源于stack exchange,提问作者YuriNator
相关产品推荐
相关产品推荐

