将NOT NULL列插入现有表

ANP*_*ANP 109 sql-server alter-table notnull

我试过了:

ALTER TABLE MY_TABLE 
ADD STAGE INT NOT NULL;
Run Code Online (Sandbox Code Playgroud)

但它给出了此错误消息:

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

Pav*_*yuk 201

作为一个选项,您最初可以创建Null-able列,然后使用有效的非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
Run Code Online (Sandbox Code Playgroud)

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

ALTER TABLE MY_TABLE ADD STAGE INT NOT NULL DEFAULT '0'
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

  • 使用 SQLite 的 ANDROID 开发人员请注意,SQLite 不支持`ALTER COLUMN`。 (2认同)
  • 我以前从未见过“ GO”,它似乎是[不属于SQL规范的一部分](http://stackoverflow.com/a/2299255/2477364),因此可能会导致脚本无法执行而导致失败由支持它的工具之一执行。只是使用分号?我不建议散布Microsoft标准,因为它们很少关心任何既定的合理标准,而要发明自己只是为了发明自己。除此之外,有用的答案。 (2认同)
  • @Neon感谢您的评论,但最初的问题是关于MS SQL服务器,这就是为什么GO在那里.但我会在答案中添加一个关于它的说明. (2认同)

Mar*_*ith 12

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

ALTER TABLE dbo.YourTbl ADD
    newcol int NOT NULL CONSTRAINT DF_YourTbl_newcol DEFAULT 0
Run Code Online (Sandbox Code Playgroud)

在Enterprise Edition上,这是自2012年以来仅元数据的更改

  • 您不需要*,但这是一种选择。 (2认同)

Joh*_*han 11

更快的解决方案

如果您像我一样需要在包含大量数据的表上执行此操作,则 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
Run Code Online (Sandbox Code Playgroud)

这是针对 SQL Server 的


a'r*_*a'r 6

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

ALTER TABLE MyTable ADD Stage INT NOT NULL DEFAULT '-';
Run Code Online (Sandbox Code Playgroud)

  • 默认部分中的“减号”是什么意思? (2认同)