【问题标题】:Unable to add a "NOT NULL" column to empty table in SQL Server无法将“NOT NULL”列添加到 SQL Server 中的空表
【发布时间】:2009-06-30 17:11:09
【问题描述】:

我了解在 SQL Server 中向包含数据的表添加列时,该列必须具有 NULL 选项或默认值。否则 SQL Server 会用什么填充新行?

我不知道为什么我不能将 NOT NULL 列添加到空表中。我已经在 SQL 2008 的两个实例和 SQL 2005 的一个实例上进行了尝试,没有任何问题。但是,使用 SQL 2000 的客户确实存在此问题。这与 SQL 2000 有关还是您可以关闭的选项。希望这是一种选择。

Select @@Version

Microsoft SQL Server 2000 - 8.00.760 (Intel X86) 2002 年 12 月 17 日 14:22:05 版权所有 (c) 1988-2003 Windows 上的 Microsoft Corporation Developer Edition NT 5.1(内部版本 2600:Service Pack 3)

Select count(*) from actinv

0

ALTER TABLE [ActInv] ADD [BATCHNUMBER] NVARCHAR(50) NOT NULL

消息 4901,第 16 级,状态 1,第 1 行 ALTER TABLE 只允许添加可以包含空值或具有 指定了默认定义。无法将列“BATCHNUMBER”添加到表中 'ActInv' 因为它不允许空值并且没有指定 DEFAULT 定义。

【问题讨论】:

  • 我知道这听起来很愚蠢,但桌子真的是空的吗?
  • 好吧,我从 ActInv 中选择 count(*),它返回零!
  • Slect count(*) 仅返回至少一列不为空的记录。我知道,听起来很傻,但请尝试使用 select * from table 代替。
  • 我从来不知道!虽然 Select * 返回零行,但我刚刚检查过。
  • 尼尔 N,你错了。 create table b(a int) insert b values(null) select count(*) from b -- 1

标签: sql-server sql-server-2000 null ddl


【解决方案1】:

SQL Server 2000 不检查空表。您看到的是 SQL Server 2005/2008 的改进。

以下两个步骤中的任何一个都将在 SQL Server 2000 中针对空表进行更改:

ALTER TABLE [ActInv] ADD [BATCHNUMBER] NVARCHAR(50) NOT NULL CONSTRAINT ActInv_Temp DEFAULT 'foo'
ALTER TABLE [ActInv] DROP CONSTRAINT ActInv_Temp

ALTER TABLE [ActInv] ADD [BATCHNUMBER] NVARCHAR(50) NULL 
ALTER TABLE [ActInv] ALTER COLUMN [BATCHNUMBER] NVARCHAR(50) NOT NULL 

【讨论】:

  • 这工作得很好——除了更改表以添加可空列和将表更改为 NOT NULL 之间,我必须更新 SET newcol = 。 SQL 不允许将具有所有空值的可空列转换为 NOT NULL 列。真的很明显:-)
  • @markau,此答案特定于 OP 的问题,即 OP 在 SQL Server 2000 上有一个 empty 表。对于空表,更新是无操作的,而不是需要。 SQL Server 2005 及更高版本将检查表是否添加非空列,如果表为空则继续。
【解决方案2】:

我无权访问 2000 进行验证,但是您可以添加一个具有命名默认值的列,使其成功,然后删除命名默认值吗?

【讨论】:

  • 该 SQL 是由更新程序生成的。我希望这是您可以关闭的选项。现在看来我必须修改程序以按照您建议的方式解决这个问题,这很糟糕。
【解决方案3】:

错误消息告诉您无法添加新列因为它不允许空值并且没有指定 DEFAULT 定义。

您需要为不可为空的字段添加一个默认值,如下所示:

ALTER TABLE [ActInv] ADD [BATCHNUMBER] NVARCHAR(50) DEFAULT 'foo' NOT NULL

编辑:我刚刚看到了您在单独的 SQL Server 安装(2000 和 2005)上所做的一切。如果表真的是空的,也许最好的解决方案是删除/创建表。这听起来像是 SQL Server 2000 中的一个错误。

【讨论】:

  • 嗯?他已经说过该表是空的-在我看来,问题是:为什么在创建表时可以在没有默认定义的情况下使用 NOT NULL 但不能将 NOT NULL 添加到空表中。
  • 问题是如果表中没有行,为什么SQL2000需要一个DEFAULT? SQL2005 和 SQL2008 不行!
【解决方案4】:

你有没有依次考虑过以下2个:

ALTER TABLE [ActInv] ADD [BATCHNUMBER] NVARCHAR(50) 
GO

ALTER TABLE [ActInv] ALTER COLUMN [BATCHNUMBER] NVARCHAR(50) NOT NULL
GO

我认为这也适用于 2000 年(我这里只有 2005 年)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-12
    • 2014-08-22
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    • 1970-01-01
    • 1970-01-01
    • 2017-02-16
    相关资源
    最近更新 更多