如何在SQL Server中实现类似MySQL的ON UPDATE自动更新时间功能?
在SQL Server中实现自动记录行更新时间的方法
MySQL里用ON UPDATE CURRENT_TIMESTAMP就能自动捕获行的更新时间,在SQL Server中可以通过以下两种方式实现相同效果:
方法一:触发器实现(兼容所有SQL Server版本)
这是通用方案,不管你用哪个版本的SQL Server都能生效。
1. 创建表
先建表,给date_modified列设置默认值为当前时间,建议同时添加主键(方便触发器精准更新):
CREATE TABLE important_action ( id INT IDENTITY(1,1) PRIMARY KEY, myAction VARCHAR(50), actionStatus VARCHAR(5), date_modified DATETIME2(3) CONSTRAINT DF_important_action_date_modified DEFAULT SYSDATETIME() COMMENT 'Date and time record has been modified.' );
2. 创建更新触发器
写一个触发器,当表中数据被更新时,自动把对应行的date_modified改成当前时间:
CREATE TRIGGER TR_important_action_UpdateModifiedTime ON important_action AFTER UPDATE AS BEGIN SET NOCOUNT ON; -- 通过主键关联临时表inserted,只更新被修改的行,避免全表更新 UPDATE t SET t.date_modified = SYSDATETIME() FROM important_action t INNER JOIN inserted i ON t.id = i.id; END;
注意:触发器里必须用主键或唯一键关联inserted表,不然会误更新所有行。
方法二:SQL Server 2016+内置语法
从SQL Server 2016开始,不用写触发器,直接在列定义里加ON UPDATE就能实现:
CREATE TABLE important_action ( id INT IDENTITY(1,1) PRIMARY KEY, myAction VARCHAR(50), actionStatus VARCHAR(5), date_modified DATETIME2(3) CONSTRAINT DF_important_action_date_modified DEFAULT SYSDATETIME() ON UPDATE SYSDATETIME() COMMENT 'Date and time record has been modified.' );
这种写法更简洁,但只支持SQL Server 2016及更高版本。
内容的提问来源于stack exchange,提问作者Itay Moav -Malimovka
相关产品推荐
相关产品推荐

