我有下表:
Study id
Pepsi 1
Coke 2
Sprite 3
我需要在上表中添加一个新列timestamp
。即,研究创建时间和日期将存储在此栏中。我应该为现有行设置什么值?或者“Timestamp”列是否只有新创建的行的值?
我使用以下查询添加新列:
alter table Study add Timestamp datetime
答案 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”列使用的时间。