【问题标题】:Cannot insert the value NULL into column where using Sql Select statement无法将值 NULL 插入使用 Sql Select 语句的列中
【发布时间】:2016-10-18 11:17:49
【问题描述】:

你能告诉我如何避免下面提到的异常吗?

 INSERT INTO [Migrated].[dbo].[Cities] (Name, ZipCode)
     SELECT DISTINCT 
         a.City, a.ZipCode 
     FROM
         [Legacy].[dbo].[Ziplist] AS a 
     WHERE
         (a.City IS NOT NULL AND a.ZipCode IS NOT NULL);

例外:

无法将值 NULL 插入到列“IsDeleted”、表“Migrated.dbo.Cities”;列不允许空值。插入失败。

【问题讨论】:

标签: sql sql-server sql-server-2014


【解决方案1】:

正如@jamieD77 所说,您在插入语句中缺少IsDeleted 列。

错误意味着该列被标记为“NOT NULL”,因此在创建新行时必须插入一个值。

因此您要么需要自己从表中删除 NULL 约束,要么在列中插入一个值。

 INSERT INTO [Migrated].[dbo].[Cities] (Name, ZipCode, IsDeleted)
 select  DISTINCT a.City,a.ZipCode,0 from [Legacy].[dbo].[Ziplist] as a where ( 
 a.City is not null and a.ZipCode is not null);

对于bit 字段,我认为它是(但您应该确认!)0 的值将是false1 将是true。如果字段是不同的数据类型,这些值可能有不同的含义!!!

【讨论】:

  • 你能告诉我如何插入一个值吗?我需要在那里插入false
  • 如果二进制你要插入一个 0,请确认,例如在某些情况下我可能会使用 tinyint 来允许更多的含义,而不仅仅是删除或不删除。在删除等之前可能存在标记以供审核的状态。
  • 是的,没关系。列类型是bit。它正在工作。非常感谢:)
【解决方案2】:

错误消息的意思是IsDeleted 列被声明为NOT NULL 并且它没有默认值。在这种情况下,您可能会默认插入未删除的记录,因此您可能需要更改列:

alter table cities alter column IsDeleted int not null default 0;

或者,您可以编写查询以包含该列:

INSERT INTO [Migrated].[dbo].[Cities] (Name, ZipCode, IsDeleted)
    select  DISTINCT zl.City, zl.ZipCode, 
    from [Legacy].[dbo].[Ziplist] zl
    where a.City is not null and a.ZipCode is not null;

这些答案假定IsDeleted 是一个整数,“0”表示假。如果值存储方式不同,则需要适当修改代码。

【讨论】:

    【解决方案3】:

    只需添加列插入列表和固定值选择列表。

    INSERT INTO [Migrated].[dbo].[Cities] (Name, ZipCode, IsDeleted)
    select  DISTINCT a.City,a.ZipCode, 0 IsDeleted --0 means false
      from [Legacy].[dbo].[Ziplist] as a 
        where (a.City is not null and a.ZipCode is not null);
    

    【讨论】:

      猜你喜欢
      • 2022-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多