无法将值NULL插入列错误显示错误的列名称

时间:2014-03-04 22:39:38

标签: sql sql-server-2005

我在我的表中添加了一个新列(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”列实际上是表中的第二列。有人可以指出我正确的方向与此错误?

提前致谢。

1 个答案:

答案 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 JOINLEFT JOIN显然不正确,因为您仅针对包含值的行过滤#tempTable,并且不想更新与mpt无匹配的tt - -so LEFT JOIN表示错误的逻辑连接类型。

我真的把#34;"作为对ON条款的评论,因为我想知道OldValue是否真的是Id。它可能是 - 你最了解你的餐桌。它只是在我的脑海中引起了一个温和的红旗,看到Id列与其名称中没有Id的列进行比较(因此如果 正确,我建议OldId作为比OldValue更好的列选择。

另外,我建议您再也不要仅为Id命名列 - 数据库中的每个表中的列名应该相同。此外,当连接时间到来时,当来自不同表的列重合时,您将更有可能犯错。最好遵循SomethingId表格中Something的格式,而不仅仅是Id。相应地,建议的旧列名称为OldSomethingId