在现有表中插入NOT NULL列


121

我努力了:

ALTER TABLE MY_TABLE 
ADD STAGE INT NOT NULL;

但是它给出了此错误信息:

ALTER TABLE仅允许添加可以包含空值或具有DEFAULT定义的列

Answers:


221

作为选择,您可以首先创建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;

1
我个人比较喜欢这里的第一种方法,如果您有值可以手动输入。这样,您不必担心在不需要约束的情况下创建和删除默认约束。
Mark W Dickson

1
@acarlon-我认为这已经到了。update您提到的危险声明在任何查询中都是有害的。它应该足够简单,以查看update此处的语句中是否还有其他列。通常,您一次只能添加一两列。update在本例中,如果您碰巧在语句中添加了一个不属于该列的额外列,那么也许您不应该首先负责数据。
Mark W Dickson

1
使用SQLite的ANDROID开发人员请注意,ALTER COLUMNSQLite不支持。
Sdghasemi

2
我从未见过GO,它似乎不是SQL规范的一部分,因此,可能会导致脚本无法通过支持它的工具之一执行而失败。只是使用分号?我不建议散布Microsoft标准,因为它们很少在乎任何已建立的合理标准,而要发明自己只是为了发明自己。除此之外,有用的答案。
Neonit

2
@Neon感谢您的评论,但最初的问题是关于MS SQL Server的,这就是为什么GO在那里。但我会在答案中添加一条注释。
Pavel Morshenyuk '16

13

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

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

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


2
不需要,但这是一种选择。
马特

6

该错误消息具有很强的描述性,请尝试:

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

默认部分中的“减号”是什么意思?
Mladen B.

3

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

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


MySQL支持将非空列添加到具有数据的现有表中,其中将数据类型的“明智的”空值提供给现有行(即,对于浮点为0.0,对于整数为0,对于字符串为空字符串,等等)。
曾荫权

2

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

BEGIN TRANSACTION
GO
ALTER TABLE dbo.YOURTABLE ADD
    YOURCOLUMN bit NOT NULL CONSTRAINT DF_YOURTABLE_YOURCOLUMN DEFAULT 0
GO
COMMIT

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

0
Alter TABLE 'TARGET' add 'ShouldAddColumn' Integer Not Null default "0"

1
这个答案对这个主题有什么帮助?
巴布桑
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.