将不可为空的列添加到SQL Server中的现有表中?

san*_*084 45 sql database sql-server

我已经有一个由数据组成的表.我需要更改表以添加两个非空的新列.如何在不丢失任何现有数据的情况下做到这一点?


这是我尝试的(通过右键单击表并选择设计):

  1. 添加了新的列'EmpFlag'(bit,null),'CreatedDate'(datetime,null)

  2. 更新了表中的"EmpFlag"列,以获得一些有效值.(只是想在一个字段上工作,所以我没有更新'CreatedDate'字段)

  3. 现在右键单击表,设计,并使其不为空.

当我尝试保存时,出现此错误消息:

不允许保存更改.您所做的更改需要删除并重新创建以下表.

Jos*_*ama 68

您只需在新列中设置默认值,即可添加它们.

alter table table_name
    add column_name datetime not null
       constraint DF_Default_Object_Name default (getdate())
Run Code Online (Sandbox Code Playgroud)

或者这个用于varchar字段.

alter table table_name
    add column_name varchar(10) not null
       constraint DF_Default_Object_Name default ('A')
Run Code Online (Sandbox Code Playgroud)

如果在添加列后不需要,也可以删除默认值.

alter table table_name
    drop constraint DF_Default_Object_Name
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果您有100%填充因子(默认值),那么将数据添加到所有这样的行将导致一堆页面拆分.这是很多I/O,我相信这是一个阻塞操作.这在适度小的表上很好,但是如果你有一个大而高的吞吐量表,它基本上是一个离线操作.据我所知,作为"在线"操作执行此操作的唯一方法是创建具有所需结构的新表; 将数据与触发器和批处理操作合并; 最后在一个事务中将新表交换到位(同义词工作正常) (2认同)

Aar*_*and 25

如果您不想在列上放置默认值,则可以:

  1. 将新列创建为NULLable
  2. 适当更新现有数据
  3. 添加NOT NULL约束