向现有表插入 NOTNULL 列

我试过了:

ALTER TABLE MY_TABLE
ADD STAGE INT NOT NULL;

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

ALTERTABLE 只允许添加可以包含空值或 具有指定的默认定义

307550 次浏览

作为一个选项,您可以首先创建 NULL-able 列,然后用有效的 NOT NULL 值更新表列,最后用 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 Server 上运行这个代码时,它是必须的。如果您想在 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;

错误消息描述性很强,请尝试:

ALTER TABLE MyTable ADD Stage INT NOT NULL DEFAULT '-';

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

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

在企业版,这是一个自2012年以来的 元数据只会改变

ALTER TABLE `MY_TABLE` ADD COLUMN `STAGE` INTEGER UNSIGNED NOT NULL AFTER `PREV_COLUMN`;

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

BEGIN TRANSACTION
GO
ALTER TABLE dbo.YOURTABLE ADD
YOURCOLUMN bit NOT NULL CONSTRAINT DF_YOURTABLE_YOURCOLUMN DEFAULT 0
GO
COMMIT
Alter TABLE 'TARGET' add 'ShouldAddColumn' Integer Not Null default "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

这是针对 SQLServer 的