Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否将不可为空的列添加到SQL server中的现有表中?_Sql_Sql Server_Database - Fatal编程技术网

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

是否将不可为空的列添加到SQL server中的现有表中?,sql,sql-server,database,Sql,Sql Server,Database,我已经有了一个包含数据的表。我需要修改表以添加两个不为null的新列。如何在不丢失任何现有数据的情况下做到这一点 以下是我尝试的(通过右键单击表格并选择Design): 添加了新列“EmpFlag”(位,null)、“CreatedDate”(日期时间, 空) 已更新表中的“EmpFlag”列,以具有一些有效值。(只是想处理一个字段,所以我没有更新“CreatedDate”字段) 现在右键单击table,design,并使其不为null 当我试图保存时,出现以下错误消息: 不允许保存更改您所做

我已经有了一个包含数据的表。我需要修改表以添加两个不为null的新列。如何在不丢失任何现有数据的情况下做到这一点


以下是我尝试的(通过右键单击表格并选择Design):

  • 添加了新列“EmpFlag”(位,null)、“CreatedDate”(日期时间, 空)

  • 已更新表中的“EmpFlag”列,以具有一些有效值。(只是想处理一个字段,所以我没有更新“CreatedDate”字段)

  • 现在右键单击table,design,并使其不为null

  • 当我试图保存时,出现以下错误消息:

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


    您只需在新列中设置一个默认值,这将允许您添加它们

    alter table table_name
        add column_name datetime not null
           constraint DF_Default_Object_Name default (getdate())
    
    或者这个用于varchar字段

    alter table table_name
        add column_name varchar(10) not null
           constraint DF_Default_Object_Name default ('A')
    
    如果在添加列后不需要默认值,也可以删除默认值

    alter table table_name
        drop constraint DF_Default_Object_Name
    

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

  • 将新列创建为可空
  • 适当更新现有数据
  • 添加NOTNULL约束

  • 可以在GUI中添加具有默认值的新NOTNULL列,如下所示。将现有的更改为NOTNULL似乎是另一回事。我收到了和你一样的信息。一个选项是使用默认值创建一个新的NOTNULL列来替换旧列,然后将旧列数据复制到新列数据

  • 将表格放入设计视图(右键单击表格->选择设计)
  • 添加列,选择数据类型
  • 取消选中Allownulls并设置默认值或Binding=您的默认值,如下所示

  • 大体上我同意,但这取决于具体情况。如果要添加CreatedDate和ModifiedDate等列,可以应用默认值,然后根据需要返回并调整旧数据,这样就不必担心2到3之间的任何停机时间(或滑入的新行)。在标准默认值有意义的情况下,这使您可以灵活地不同步所有尚不知道新列的代码。这对于步骤3很有用-请注意,如果您有100%的填充因子(默认值),那么向所有行添加这样的数据将导致一系列页面拆分。这是大量的I/O,我相信这是一个阻塞操作。对于一个中等规模的表来说,这很好,但是如果您有一个大的、高吞吐量的表,那么它基本上就是一个脱机操作。据我所知,作为“在线”操作,唯一的方法是创建一个具有所需结构的新表;使用触发器和批处理操作合并数据;最后,在一个事务中将新表交换到位(同义词效果很好)。这个答案对我来说很好,但后来我意识到我可以在SSMS中的Design table屏幕中执行完全相同的操作-添加一个不可为null的列,并在列属性中设置默认值或绑定,然后保存更改,如果需要,删除默认值或事后绑定我多年来一直在努力解决这个问题,总是编写SQL代码来重新创建表并填充数据。我不知道是这么简单。我浪费了很多时间:-我认为这是SSMS设计工具的一个局限性。尝试使用SQL语句:“alter table tablename alter column EmpFlag bit NOTNULL”。只需用这个运行一个新的查询,并用实名更改表名。这与您所做更改的细节无关,而是反映了SSMS中新的默认行为—防止人们在不知情的情况下对大型生产表进行灾难性更改,这些更改实际上会使他们在复制数据和重新填充表所需的时间内离线。您可以关闭此选项“工具>选项>设计器>表+数据库设计器>防止保存更改…”。。。(取消选中此项)。但是,对生产表进行这些更改时要非常小心。