更新时的Sql server设置当前时间戳

sta*_*rhu 5 sql-server

我需要一个时间戳字段,每次用户修改记录时都会更新.

到目前为止,我使用MySql,我甚至可以在字段创建中使用它:

Alter table myTable add `last_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP **ON UPDATE CURRENT_TIMESTAMP**
Run Code Online (Sandbox Code Playgroud)

我在Sql Server中找不到这种可能性.

然后我尝试写一个触发器.

在MySql触发器中,这很简单:

Set new.last_time=CURRENT_TIMESTAMP();
Run Code Online (Sandbox Code Playgroud)

Sql Server似乎既不知道新的语法,也不知道旧的语法,它给我编译错误.

的:

update myTable set last_time =CURRENT_TIMESTAMP;
Run Code Online (Sandbox Code Playgroud)

工作,但它更新了所有行而不是当前行.

是不是有办法告诉Sql Server更新当前记录?我应该用"更新myid = something"吗?

SQL Server不知道它正在处理哪个实际记录?

小智 18

如果你真的需要一个时间戳 - 然后在插入和更新时触发,用当前时间映射更新列.

CREATE TRIGGER dbo.trgAfterUpdate ON dbo.YourTable
AFTER INSERT, UPDATE 
AS
  UPDATE dbo.YourTable
  SET last_changed = GETDATE()
  FROM Inserted i
Run Code Online (Sandbox Code Playgroud)

要更新单行(已编辑或插入),您应该使用

CREATE TRIGGER dbo.trgAfterUpdate ON dbo.YourTable
AFTER INSERT, UPDATE 
AS
  UPDATE f set LastUpdate=GETDATE() 
  FROM 
  dbo.[YourTable] AS f 
  INNER JOIN inserted 
  AS i 
  ON f.rowID = i.rowID;
Run Code Online (Sandbox Code Playgroud)

这些应该是你所需要的.GETUTCDATE()如果你想要它在UTC(我更喜欢)

SQL Server绝对知道它处理的行,只是你有严重的SQL基础问题.

更新myTable设置last_time = CURRENT_TIMESTAMP; 工作,但它更新了所有行而不是当前行.

是的,猜猜是什么 - 因为这正是你告诉SQL Server的:更新表中的所有行.

Sql Server不知道它正在处理哪个实际记录?

集合没有当前行;)这就是问题开始的地方.

完全按照你的意愿完成这个的唯一方法是在我的答案开头:时间戳.但是,由于误解,我添加了一个建议:获取一本关于SQL基础知识的书.

  • 您好,您的示例:UPDATE dbo.YourTable SET last_changed = GETDATE()FROM Inserted i ...还更新了表中的所有行...所以我将其更改为以下内容,并且它完美运行(尽管您多次说过)我有严重的SQL基础知识问题:-)):update f set last_changed = GETDATE()FROM dbo.MyTable AS f INNER JOIN insert as i on f.myid = i.myid; 谢谢您的帮助!我不知道插入逻辑表. (6认同)