无法在SQL Server中向空表添加“NOT NULL”列

时间:2009-06-30 17:11:10

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

据我所知,在向包含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(Build 2600:Service Pack 3)

Select count(*) from actinv

0

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

Msg 4901,Level 16,State 1,Line 1 ALTER TABLE仅允许添加可包含空值或具有空值的列 指定了DEFAULT定义。无法将“BATCHNUMBER”列添加到表中 'ActInv'因为它不允许空值而且没有指定DEFAULT 定义

4 个答案:

答案 0 :(得分:11)

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 

答案 1 :(得分:0)

错误消息告诉您无法添加新列,因为它不允许空值,而未指定DEFAULT定义。

您需要向非可空字段添加默认值,如下所示:

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

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

答案 2 :(得分:0)

我无法访问2000进行验证,但是您是否可以添加具有命名默认值的列,以便它成功,然后只删除命名的默认值?

答案 3 :(得分:0)

您是否按顺序考虑了以下2个:

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

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

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