我有下表:
Study id
Pepsi 1
Coke 2
Sprite 3
我需要timestamp
在上表中添加一个新列。即,研究创建时间和日期将存储在此列中。我应该为现有行设置什么值?或者“时间戳”列是否应该只对新创建的行有一个值?
我使用以下查询来添加新列:
alter table Study add Timestamp datetime
我有下表:
Study id
Pepsi 1
Coke 2
Sprite 3
我需要timestamp
在上表中添加一个新列。即,研究创建时间和日期将存储在此列中。我应该为现有行设置什么值?或者“时间戳”列是否应该只对新创建的行有一个值?
我使用以下查询来添加新列:
alter table Study add Timestamp datetime
没有办法告诉您应该为现有行设置什么值 - 这由您决定。如果您可以通过拼凑其他信息以某种方式检索创建时间,那么也许您可以一一进行,或者您可以将现有行保留到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
我应该为以前的研究设定什么值
这必须由您的企业定义。这不需要技术答案,因此这里没有人可以告诉您什么是正确的。
我使用以下查询来添加新列:
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”列使用的时间相同的时间。