【问题标题】:SQL Server : on update set current timestampSQL Server:更新时设置当前时间戳
【发布时间】:2014-04-30 22:25:00
【问题描述】:

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

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

ALTER TABLE myTable 
    ADD `last_time` timestamp NOT NULL 
        DEFAULT CURRENT_TIMESTAMP 
        ON UPDATE CURRENT_TIMESTAMP

我在 SQL Server 中找不到这种可能性。

然后我尝试编写一个触发器 - 在 MySql 触发器中这很简单:

SET new.last_time = CURRENT_TIMESTAMP();

SQL Server 似乎既不知道新语法也不知道旧语法,它在编译时给了我错误。

这个:

UPDATE myTable 
SET last_time = CURRENT_TIMESTAMP;

有效,但它更新了所有行而不是当前行。

难道没有办法告诉 SQL Server 更新当前记录吗?我应该使用UPDATE .... WHERE myid = something 吗?

SQL Server 不知道它正在处理的实际记录是什么?

【问题讨论】:

    标签: sql-server


    【解决方案1】:

    如果您真的需要时间戳 - 然后在插入和更新时触发触发器,以使用当前时间戳更新列。

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

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

    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;
    

    这些应该就是您所需要的。 GETUTCDATE() 如果你想要 UTC(我更喜欢)

    SQL Server 绝对知道它处理的行

    更新 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 inserted AS i ON f.myid = i.myid ;谢谢您的帮助!我不知道插入的逻辑表。
    【解决方案2】:

    使用 rowversion 数据类型。 Rowversion 通常用作 MS-SQL 服务器中对表行进行版本标记的机制。 rowversion 数据类型只是一个递增的数字,不保留日期或时间。要记录日期或时间,请使用 datetime2 数据类型。 更多信息请阅读 msdn 中的 rowversion (http://technet.microsoft.com/en-us/library/ms182776.aspx)

    【讨论】:

      猜你喜欢
      • 2014-09-13
      • 2011-06-03
      • 2021-11-23
      • 1970-01-01
      • 1970-01-01
      • 2015-06-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多