我已经尝试过:
ALTER TABLE MY_TABLE
ADD STAGE INT NOT NULL;
但它会给出这个错误信息:
ALTER TABLE只允许添加能够包含null值或已指定DEFAULT定义的列
我已经尝试过:
ALTER TABLE MY_TABLE
ADD STAGE INT NOT NULL;
但它会给出这个错误信息:
ALTER TABLE只允许添加能够包含null值或已指定DEFAULT定义的列
作为一种选择,您可以最初创建可空列,然后使用有效的非空值更新表列,最后使用 ALTER column 来设置 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'
更新:请注意上面的答案包含 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;
GO
,并且它似乎不是 SQL 规范的一部分,因此对于未被支持的工具执行的脚本可能会导致失败。只使用分号?我不建议传播微软标准,因为他们很少关心任何已经建立和合理的标准,而是发明自己的标准。除此之外,这是一个有帮助的答案。 - Neonit如果您不允许该列为空,您需要提供默认值来填充现有的行。例如:
ALTER TABLE dbo.YourTbl ADD
newcol int NOT NULL CONSTRAINT DF_YourTbl_newcol DEFAULT 0
自2012年起,在企业版中,这是一个仅涉及元数据的更改,详情请参考此链接
UPDATE
需要更新所有行,然后将其更改为NOT NULL
也会(有些令人惊讶地)增加日志文件的大小。https://dba.stackexchange.com/questions/29522/why-does-alter-column-to-not-null-cause-massive-log-file-growth - Martin SmithNULL
- 尽管仅是暂时的。如果您想运行ALTER TABLE ADD column NOT NULL
并且表中有行,则需要提供默认值。 - Martin Smith更快的解决方案
如果您需要在包含大量数据的表上执行此操作,使用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 的内容
ALTER TABLE MyTable ADD Stage INT NOT NULL DEFAULT '-';
其他SQL实现也有类似的限制。原因是添加列需要添加该列的值(逻辑上,即使没有物理上),这些值默认为NULL
。如果不允许NULL
,并且没有default
,那么值将是什么?
由于SQL Server支持ADD CONSTRAINT
,我建议使用Pavel的方法创建可空列,然后在填充非NULL
值后添加NOT NULL
约束。
这对我很有用,还可以从设计视图“借用”,进行更改 -> 右键单击 -> 生成变更脚本。
BEGIN TRANSACTION
GO
ALTER TABLE dbo.YOURTABLE ADD
YOURCOLUMN bit NOT NULL CONSTRAINT DF_YOURTABLE_YOURCOLUMN DEFAULT 0
GO
COMMIT
ALTER TABLE `MY_TABLE` ADD COLUMN `STAGE` INTEGER UNSIGNED NOT NULL AFTER `PREV_COLUMN`;
Alter TABLE 'TARGET' add 'ShouldAddColumn' Integer Not Null default "0"