【问题标题】:"Cannot insert the value NULL into column" when trying to update a column in SQL尝试更新 SQL 中的列时“无法将值 NULL 插入列”
【发布时间】:2011-09-29 17:55:05
【问题描述】:

我正在尝试使用下面的查询更新不为空的列的值

update Bom set CountryCode=
case
when CurrencyId='CHF' then 'CH' 
when CurrencyId='NZD' then 'NZ'
when CurrencyId='KRW' then 'KR'
when CurrencyId='HKD' then 'HK'
when CurrencyId='MXN' then 'MX' 
when CurrencyId='USDe' then 'DE'
when CurrencyId='JPY' then 'JP'
when CurrencyId='EUR' then 'DE'
when CurrencyId='DKK' then 'DK' 
when CurrencyId='GBP' then 'GB'
when CurrencyId='AUD' then 'AU'
when CurrencyId='RMB' then 'CN'
when CurrencyId='USDu' then 'US' 
when CurrencyId='NOK' then 'NO'
when CurrencyId='CAD' then 'CA'
when CurrencyId='USDm' then 'MX'
when CurrencyId='SEK' then 'SE'
when CurrencyId='SGD' then 'SG'
when CurrencyId='TWD' then 'TW'
when CurrencyId='ZAR' then 'ZA'
end

但由于某种原因,我收到一条错误消息

无法将值 NULL 插入 “国家代码”列,表格 'Mouser_BOM.dbo.Bom';列不 允许空值。更新失败。

我没有插入任何空值,但仍然收到此错误。有人可以帮助我为什么会得到这个。

【问题讨论】:

  • 你传入的是什么 CurrencyId?您是否考虑过在您的案例语句中添加一个默认值,以防万一您收到无法识别的 CurrencyId?

标签: sql notnull


【解决方案1】:

在语句的末尾添加一个 ELSE 子句,以捕获您的条件都不匹配的情况。那应该摆脱错误。所以像:

...
  when CurrencyId='SGD' then 'SG'
  when CurrencyId='TWD' then 'TW'
  when CurrencyId='ZAR' then 'ZA'
  else '??'
end

【讨论】:

  • 我的想法完全正确 - 也检查您的起始数据,但您应该添加某种默认情况。
  • @user648610:请养成接受提供的最佳答案的习惯,即解决您问题的答案。在 StackOverflow 上这样做是正确且有礼貌的事情,并且可以激励其他人继续帮助那些寻找答案的人。 See the FAQ
  • Re: marc_s - 它让世界变得更快乐,为每个人微笑! :)
【解决方案2】:

那是一个相当讨厌的案例陈述。我的猜测是您的案例之一不匹配。

看看,用不同的方式实现同​​样的事情不是更容易吗?

除了少数例外,几乎所有更新都可以使用子字符串完成。

例如

UPDATE
  BOM
SET 
  CountryCode = SUBSTRING(CountryCode,1,2)
WHERE
  CountryCode IN
(
  'CHF',
  'HKD'
  -- the rest of these go here
)

然后手动进行异常处理。

虽然很高兴你能找到这个特定问题的答案,但我的建议是找出其中的规律,不要让自己的生活太难。

【讨论】:

    【解决方案3】:

    首先,您的案例陈述可以简化。

     CASE CurrencyId 
     WHEN 'CHF' THEN 'CH'
     WHEN 'NZD' THEN 'NZ' 
     WHEN 'KRW' THEN 'KR' 
     END
    

    其次,必须有一个条件与其中任何一个都不匹配。进行选择以找到它:

            SELECT *
            FROM Bom
            WHERE case CurrencyId 
            when 'CHF' then 'CH' 
            when 'NZD' then 'NZ' 
            when 'KRW' then 'KR' 
            ...
            end IS NULL
    

    【讨论】:

    • 这看起来好多了。谢谢
    猜你喜欢
    • 2012-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-06
    • 1970-01-01
    • 2014-10-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多