3

我有下表:

Study   id
Pepsi   1
Coke    2
Sprite  3

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

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

alter table Study add Timestamp datetime
4

2 回答 2

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 从未将其设置为 时才有用NULLINSERT例如,如果一个语句显式放置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
于 2013-10-08T14:30:04.003 回答
0

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

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

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

alter table Study add Timestamp datetime

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

alter table Study add CreateDate datetime not null default current_timestamp;

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

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

于 2013-10-08T14:23:35.157 回答