无法添加“NOT NULL” SQL Server 中的列到空表

发布于 2024-07-26 09:03:27 字数 741 浏览 8 评论 0原文

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

但是,我不知道为什么不能将 NOT NULL 列添加到空表中。 我已在两个 SQL 2008 实例和一个 SQL 2005 实例上尝试过此操作,没有出现任何问题。 然而使用 SQL 2000 的客户确实有这个问题。 这与 SQL 2000 相关还是您可以关闭它的选项。 我们希望这是一个选择。

Select @@Version

Microsoft SQL Server 2000 - 8.00.760(英特尔 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 定义。

I understand that when adding a column to a table containing data in SQL server, the column must have a NULL option or a default. Otherwise what would SQL Server pad the new rows with?

I am at a loss as to why I can't add a NOT NULL column to an empty table however. I have tried this on two instances of SQL 2008 and one instance of SQL 2005 with no problems. However a customer with SQL 2000 does have this problem. Is this related to SQL 2000 or is it an option you can turn off. Let's hope it's an option.

Select @@Version

Microsoft SQL Server 2000 - 8.00.760 (Intel X86) Dec 17 2002 14:22:05
Copyright (c) 1988-2003 Microsoft Corporation Developer Edition on Windows
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 only allows columns to be added that can contain nulls or have a
DEFAULT definition specified. Column 'BATCHNUMBER' cannot be added to table
'ActInv' because it does not allow nulls and does not specify a DEFAULT
definition.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

泛滥成性 2024-08-02 09:03:27

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 

SQL Server 2000 does not check for an empty table. What you are seeing is an improvement in SQL Server 2005/2008.

Either of the following two step processes will make the change in SQL Server 2000 against an empty table:

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

go

ALTER TABLE [ActInv] ADD [BATCHNUMBER] NVARCHAR(50) NULL 
ALTER TABLE [ActInv] ALTER COLUMN [BATCHNUMBER] NVARCHAR(50) NOT NULL 
自在安然 2024-08-02 09:03:27

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

I don't have access to 2000 to verify, but can you add a column with a named default, so that it succeeds, then just drop the named default?

初见 2024-08-02 09:03:27

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

您需要向非列添加默认值-nullable 字段如下:

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

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

The error message tells you that you cannot add the new column because it does not allow nulls and does not specify a DEFAULT definition.

You need to add a default value to the non-nullable field like this:

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

Edit: I just saw exactly what you do on separate SQL Server installations (2000 and 2005). If the table is truly empty perhaps the best solution is to drop/create the table. It sounds like a bug in SQL Server 2000.

梦巷 2024-08-02 09:03:27

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

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

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

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

Have you considered the following 2 in sequence:

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

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

I think that should work on 2000 as well (I only have 2005 here)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文