在添加列时保留表的数据

时间:2015-09-30 18:16:19

标签: sql-server tsql database-design

我需要添加一个[new_date]列,我将从我的[date] sql表中获取到现有的表[returns]并创建主键。这个[returns]表已经有6500万条记录,而我可以重新填充所有数据。这样做最简单的方法是什么。

我的想法是用临时名称重命名表。说[returns_old]然后放下并创建我的新表并分配我的主键。我认为然后加入[returns_old]和我的[d_date],因为我填充新表会起作用。

3 个答案:

答案 0 :(得分:0)

假设您不关心列的顺序,因为可以使用视图更轻松地管理列顺序,该方法实际上归结为列本身是否可以为空。

如果列可以为null,那么只需要一个简单的语句就可以将列附加到表中。对于该列,所有记录都将为NULL,直到您从源表中更新它们为止。

ALTER TABLE [returns] ADD [new_date] DATETIME

如果列不能为null,则需要再添加几个步骤。

ALTER TABLE [returns] ADD [new_date] DATETIME
GO
-- Update all existing records so that no existing value is NULL
ALTER TABLE [returns] ALTER COLUMN [new_date] DATETIME NOT NULL

如果列顺序对您很重要,我会尽可能重新考虑(并且有很多原因可以这样做)。一些原因:

答案 1 :(得分:0)

您应该首先添加一个新的空列,因为这是一个现有的表。

ALTER TABLE [returns] ADD [new_date] DateTime NULL 

获得新列后,您可以使用update语句从另一个表更新日期列。

答案 2 :(得分:0)

在交易中执行此操作:

create table dbo.ReturnsTemp ( keyfield type, new_date datetime, field2 type, field3 type);   

alter table dbo.ReturnsTemp add constraint NewPKName primary key (keyfield, new_date);

begin tran
    insert into dbo.[ReturnsTemp] ( keyfield , field2, field3, new_date )
    select r.keyfield , r.field2, r.field3, d.[new_date]
      from dbo.[Returns] r     
     inner join dbo.[DateTable] d on r.keyfield = r.keyfield

    exec sp_rename 'Returns', 'Returns_Old'
    exec sp_rename 'ReturnsTemp', 'Returns'
end tran

根据表的大小和日志文件的大小,您可能需要谨慎使用此方法,并确保日志文件有足够的空间来容纳日志中的大量瞬态数据。也许先前执行日志备份。