在MSSQL中,如果表中存在现有数据,如何将列添加到“not null”类型的表中?

时间:2014-05-12 13:27:29

标签: sql-server tsql ssms

如果我在Microsoft SQL Server Management Studio中尝试此操作,如果表中存在现有数据,则会出错:

  

不允许保存更改。您所做的更改需要删除并重新创建以下表。您已对无法重新创建的表进行了更改,或者启用了“禁止保存需要重新创建表的更改”选项。

enter image description here

是否可以手动完成此操作而不丢弃表格?

3 个答案:

答案 0 :(得分:2)

如果所有行都将为此新列接收相同的非NULL值,则可以使用默认约束添加非NULL列:

alter table T add NewColumn int not null constraint DF_T_NewColumn DEFAULT 1

然后由您决定是否希望保留此默认约束,或者在列已填充后删除它:

alter table T drop constraint DF_T_NewColumn

如果你想为每一行计算不同的值,替代方案(在your answer中显示可能更合适,但你应该知道它必须扫描整个表在你的3个步骤中至少两次 - 一次设置新值然后再次,以便在更改列的可为空性时验证它们都是非NULL。

答案 1 :(得分:1)

一种方法是手动完成。

步骤1:添加列,让它为" null" (别担心,我们稍后会改变这种情况)。

ALTER TABLE [dbo].[MyTable] ADD MyColumnName int NULL 

步骤2:将列的内容更新为默认值:

UPDATE [dbo].[MyTable] SET MyColumn=1 where MyColumnName is NULL

步骤3:将列设置为" not null" (现在通过,因为列中没有空项):

ALTER TABLE [dbo].[MyTable] ALTER COLUMN MyColumn int NOT NULL

答案 2 :(得分:1)

如果在表定义的末尾添加列,则可以在SSMS中添加列。如果在现有列之间添加列,则SQL必须在“引擎盖”下执行大量操作以获取该列顺序:创建新表,复制所有数据,删除原始表,然后重命名新表。如果您拥有包含大量数据的大型数据,则可能需要很长时间(并且SSMS可能会超时)。