时间戳、行版本和日期时间 - 插入或更新行时我需要一个标记

Posted

技术标签:

【中文标题】时间戳、行版本和日期时间 - 插入或更新行时我需要一个标记【英文标题】:timestamp, rowversion and datetime - I need a mark when a row is inserted or updated 【发布时间】:2013-05-22 09:08:11 【问题描述】:

我有以下要求:

我有一个表,其中包含 1 个唯一的自动增量 Int ID 和数据列。 我需要以下内容: 每次向该表中插入一行时,表右端的列必须包含该插入的完整日期时间。 此外,如果更新了一行,我需要保存该行插入表的完整日期时间的列,以更新该行以保存该行的更新时间。

现在,显而易见且非常直接的方法是: 你创建你的表:

create table My_Test_Table
(my_id int identity not null,
my_data nvarchar(max));

你改变你的表添加日期时间列和它的默认约束:

ALTER TABLE My_Test_Table
ADD [timestamp] datetime;
ALTER TABLE My_Test_Table
ADD CONSTRAINT DF_My_Test_Table_timestamp DEFAULT GETDATE() FOR [timestamp];

然后你为更新做一个很好的触发器,像这样:

CREATE TRIGGER DML_Trigger_update_My_Test_Table
ON My_Test_Table
FOR UPDATE
AS
IF @@ROWCOUNT <> 0
BEGIN
IF EXISTS (SELECT * FROM INSERTED) AND EXISTS (SELECT * FROM DELETED)
BEGIN
UPDATE My_Test_Table
SET [timestamp] = GETDATE()
FROM INSERTED
WHERE My_Test_Table.my_id = INSERTED.my_id;
END
END

现在棘手的部分是: 由于超出此处范围的原因,我想像上面那样实现这个确切的东西,但没有触发器! 是否可以? 我不想使用 SQL 类型的时间戳或行版本,这对我不起作用,我需要将日期、时间精确到毫秒才能清楚地存储在该列中。 任何想法将不胜感激。

【问题讨论】:

【参考方案1】:

你不需要触发器

您可以使用 DEFAULT 关键字作为 UPDATE 语句中的源值来使用在该列上定义的 DEFAULT 约束

UPDATE
   MyTable
SET
   foo = ...,
   bar = ...,
   ChangedDateTime = DEFAULT
WHERE
   ...;

我不会使用名为timestamp because this has meaning on SQL Server, as a synonym for rowversion 的列。对于 SQL Server 2008+,使用 datetime2(3) 准确记录毫秒。 “旧”datetime 仅精确到四舍五入的 3.33 毫秒

【讨论】:

我有点习惯列名 [timestamp] 虽然我知道上述内容。只是 Navision / Dynamics 表使用它-ofc 他们将它与类型时间戳一起使用,我将它与类型 datetime2 一起使用,并且我通常设置默认约束 sysdatetime() (显然不是 getdate() )

以上是关于时间戳、行版本和日期时间 - 插入或更新行时我需要一个标记的主要内容,如果未能解决你的问题,请参考以下文章

JPA 更新日期时间戳

如何查找在 SQL Server 表中插入或更新行的时间

MySQL数据类型 - 日期和时间类型

跨部分重新排序行时更新无效

在谷歌文档中插入日期时间

H2 时间戳 - 始终插入(或获取)当前日期