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



我有下表:

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

请注意,如果使列为空,则仅当 DML 从不将其设置为 NULL 时,DEFAULT约束才有用。例如,如果 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,现有行将不会获得默认值,而是 null。

您可能需要做出的另一个选择是使用本地时间还是 UTC 时间(例如 default getutcdate() (。 您可能希望使用服务器或其他"创建日期"列使用的时间。

最新更新