我在我的表中添加了一个新列(NewValue),它保存了一个int并允许空值。现在我想更新列,但我的insert语句只尝试更新表中的第一列而不是我指定的那一列。
我基本上从一个临时表开始,我将初始数据放入其中,它有两列,如下所示:
create table #tempTable
(
OldValue int,
NewValue int
)
然后我对该表进行插入,并根据信息NewValue可以为null。
#tempTable中的示例数据:
OldValue NewValue
-------- --------
34556 8765432
34557 7654321
34558 null
一旦完成,我计划将NewValue插入主表中,如下所示:
insert into myPrimaryTable(NewValue)
select tt.NewValue from #tempTable tt
left join myPrimaryTable mpt on mpt.Id = tt.OldValue
where tt.NewValue is not null
我只希望NewValue插入myPrimaryTable中的行,其中Id与OldValue匹配。但是,当我尝试执行此代码时,我收到以下错误:
无法将值NULL插入列'myCode',表'myPrimaryTable';列不允许空值。 INSERT失败。
但是我并没有尝试插入'myCode',我将'NewValue'指定为列,但它似乎没有看到它。我检查了NewValue并将其设置为允许int并设置为允许null,它确实存在于右侧数据库的右表中。 “myCode”列实际上是表中的第二列。有人可以指出我正确的方向与此错误?
提前致谢。
答案 0 :(得分:2)
INSERT
总是创建新行,它永远不会修改现有行。如果您跳过为INSERT
中的列指定值并且该列没有绑定DEFAULT
并且不是identity
,则该列在新行中将为NULL - 因此你的错误。我相信您可能正在寻找UPDATE
而不是INSERT
。
这是一个可能适合您的潜在查询:
UPDATE mpt
SET
mpt.NewValue = tt.NewValue
FROM
myPrimaryTable mpt
INNER JOIN #tempTable tt
ON mpt.Id = tt.OldValue -- really?
WHERE
tt.NewValue IS NOT NULL;
请注意,我将其更改为INNER JOIN
。 LEFT JOIN
显然不正确,因为您仅针对包含值的行过滤#tempTable
,并且不想更新与mpt
无匹配的tt
- -so LEFT JOIN
表示错误的逻辑连接类型。
我真的把#34;"作为对ON
条款的评论,因为我想知道OldValue
是否真的是Id
。它可能是 - 你最了解你的餐桌。它只是在我的脑海中引起了一个温和的红旗,看到Id
列与其名称中没有Id
的列进行比较(因此如果 正确,我建议OldId
作为比OldValue
更好的列选择。
另外,我建议您再也不要仅为Id
命名列 - 数据库中的每个表中的列名应该相同。此外,当连接时间到来时,当来自不同表的列重合时,您将更有可能犯错。最好遵循SomethingId
表格中Something
的格式,而不仅仅是Id
。相应地,建议的旧列名称为OldSomethingId
。