如何在创建新时间戳列时为现有行设置值?

时间:2013-10-08 14:14:59

标签: sql sql-server-2008

我有下表:

Study   id
Pepsi   1
Coke    2
Sprite  3

我需要在上表中添加一个新列timestamp。即,研究创建时间和日期将存储在此栏中。我应该为现有行设置什么值?或者“Timestamp”列是否只有新创建的行的值?

我使用以下查询添加新列:

alter table Study add Timestamp datetime

2 个答案:

答案 0 :(得分:2)

无法告诉您应该为现有行设置什么值 - 由您决定。如果您可以通过拼凑其他信息以某种方式检索创建时间,那么也许您可以逐个执行此操作,或者您可以将现有行保留为NULL

为列设置默认值GETDATE()并将其设置为NOT NULL会强制所有现有行继承当前日期和时间 - 您将无法设置这些回到NULL。我非常反对使用像1900-01-01这样的垃圾令牌来表示未知,我也不相信修改代码会说“如果日期是2013年10月8日那么那是因为我们刚才没有不知道。“因此,我建议添加一个默认的NULLable列:

ALTER TABLE dbo.Study ADD CreationTime DATETIME NULL DEFAULT CURRENT_TIMESTAMP;
GO

请注意,如果将列保留为可为空,则DEFAULT约束仅在DML从未将其设置为NULL时才有用。例如,如果INSERT语句明确地将NULL放在那里,则忽略默认值。解决这个问题的方法是使用触发器(就像你处理更新一样):

CREATE TRIGGER dbo.StudyCreationTime
ON dbo.Study
FOR INSERT 
AS
BEGIN
  SET NOCOUNT ON;

  UPDATE s
    SET s.CreationTime = CURRENT_TIMESTAMP
    FROM dbo.Study AS s
    INNER JOIN inserted AS i
    ON s.StudyID = i.StudyID;
END
GO

答案 1 :(得分:0)

  

我应该为以前的研究设定什么价值

这必须由您的公司定义。这不需要技术答案,因此这里没有人可以告诉你什么是正确的。

  

我使用以下查询添加新列:

     

alter table Study add Timestamp datetime

这将工作得很好,但这将允许空值。我可能建议将此列设置为非null,添加默认值,并稍微更改列的名称,因为timestamp是SQL Server中的保留字(与日期或时间无关的数据类型):

alter table Study add CreateDate datetime not null default current_timestamp;

请注意,这会将所有行设置为当前日期和时间,因此如果您拥有更准确的数据,则可能需要更新它们。或者,只需将列创建为可空,现有行将不会获取默认值,而是取代null。

您可能需要做出的另一个选择是使用本地时间还是UTC时间(例如default getutcdate())。您可能希望使用服务器使用的相同时间或其他“CreateDate”列使用的时间。