152

我试过了:

ALTER TABLE MY_TABLE 
ADD STAGE INT NOT NULL;

但它给出了这个错误信息:

ALTER TABLE 只允许添加可以包含空值或指定了 DEFAULT 定义的列

4

8 回答 8

269

作为一个选项,您可以最初创建 Null-able 列,然后使用有效的非空值更新表列,最后使用 ALTER 列设置 NOT NULL 约束:

ALTER TABLE MY_TABLE ADD STAGE INT NULL
GO
UPDATE MY_TABLE SET <a valid not null values for your column>
GO
ALTER TABLE MY_TABLE ALTER COLUMN STAGE INT NOT NULL
GO

另一种选择是为您的列指定正确的默认值:

ALTER TABLE MY_TABLE ADD STAGE INT NOT NULL DEFAULT '0'

UPD:请注意,上面的答案包含GO在 Microsoft SQL 服务器上运行此代码时必须执行的操作。如果你想在 Oracle 或 MySQL 上执行相同的操作,你需要;像这样使用分号:

ALTER TABLE MY_TABLE ADD STAGE INT NULL;
UPDATE MY_TABLE SET <a valid not null values for your column>;
ALTER TABLE MY_TABLE ALTER COLUMN STAGE INT NOT NULL;
于 2010-08-16T12:14:29.300 回答
17

如果您不允许该列为 Null,则需要提供默认值来填充现有行。例如

ALTER TABLE dbo.YourTbl ADD
    newcol int NOT NULL CONSTRAINT DF_YourTbl_newcol DEFAULT 0

在企业版上,这是自 2012 年以来唯一的元数据更改

于 2010-08-16T12:15:45.033 回答
6

错误消息非常具有描述性,请尝试:

ALTER TABLE MyTable ADD Stage INT NOT NULL DEFAULT '-';
于 2010-08-16T12:14:41.457 回答
4

其他 SQL 实现也有类似的限制。原因是添加列需要为该列添加值(逻辑上,即使不是物理上),默认为NULL. 如果您不允许NULL并且没有 a default,那么价值是多少?

由于 SQL Server 支持ADD CONSTRAINT,我建议使用 Pavel 创建可空列的方法,然后在用非值NOT NULL填充它后添加约束。NULL

于 2010-08-16T12:42:23.660 回答
2

这对我有用,也可以从设计视图中“借用”,进行更改->右键单击->生成更改脚本。

BEGIN TRANSACTION
GO
ALTER TABLE dbo.YOURTABLE ADD
    YOURCOLUMN bit NOT NULL CONSTRAINT DF_YOURTABLE_YOURCOLUMN DEFAULT 0
GO
COMMIT
于 2014-10-31T15:28:44.480 回答
0
ALTER TABLE `MY_TABLE` ADD COLUMN `STAGE` INTEGER UNSIGNED NOT NULL AFTER `PREV_COLUMN`;
于 2010-08-16T12:21:21.963 回答
0
Alter TABLE 'TARGET' add 'ShouldAddColumn' Integer Not Null default "0"
于 2019-05-07T07:51:03.937 回答
0

更快的解决方案

如果您像我一样需要在包含大量数据的表上执行此操作,则 ADD-UPDATE-ALTER 选项非常慢(数百万行可能需要数小时)。

如果您也不想在表上使用默认值,这里是创建列和删除默认约束的完整代码(即使对于大型表也几乎是即时的):

ALTER TABLE my_table ADD column_name INT NOT NULL CONSTRAINT my_table_default_constraint DEFAULT 0
GO

ALTER TABLE my_table DROP CONSTRAINT my_table_default_constraint 
GO

这适用于 SQL Server

于 2021-09-23T14:06:23.373 回答