如何在MSSQL中正确实现created_at与updated_at自动时间字段
MSSQL 实现自动更新的 created_at 与 updated_at 字段方案
1. 语法问题说明
你遇到的报错是正常现象,MSSQL 本身不支持 MySQL 专属的 ON UPDATE CURRENT_TIMESTAMP 字段属性。另外需要额外纠正:MSSQL 的 TIMESTAMP 类型是行版本号二进制类型,不存储时间值,和你需要的创建时间语义不符,如果你已经用 TIMESTAMP 类型的 created_at 正常拿到了时间值,大概率是字段配置存在隐性兼容问题,后续有潜在风险,建议替换为 DATETIME2 或 DATETIME 类型。
2. 正确配置方案
如果你还未建表,使用以下建表语句
CREATE TABLE current_timestamp_demos ( id INT PRIMARY KEY IDENTITY (1, 1), msg VARCHAR(255) NOT NULL, -- 创建时间默认取当前时间 created_at DATETIME2 DEFAULT CURRENT_TIMESTAMP, -- 初始默认也是当前时间,后续靠触发器自动更新 updated_at DATETIME2 DEFAULT CURRENT_TIMESTAMP );
如果你已经建完表,且不想改动已有的 created_at 配置
直接添加触发器即可实现 updated_at 自动更新,无需修改现有表结构。
3. 新增更新触发器实现自动刷新
MSSQL 需要通过 AFTER UPDATE 触发器实现行更新时自动修改 updated_at 字段,触发器代码如下:
CREATE TRIGGER trg_current_timestamp_demos_update ON current_timestamp_demos AFTER UPDATE AS BEGIN SET NOCOUNT ON; -- 关联 inserted 系统表,批量更新所有被修改行的 updated_at 字段 UPDATE current_timestamp_demos SET updated_at = CURRENT_TIMESTAMP FROM current_timestamp_demos t INNER JOIN inserted i ON t.id = i.id; END;
4. 效果验证
可以通过以下语句测试功能是否正常:
-- 插入测试数据 INSERT INTO current_timestamp_demos (msg) VALUES ('测试内容'); -- 查看插入后两个时间一致 SELECT * FROM current_timestamp_demos; -- 更新数据 UPDATE current_timestamp_demos SET msg = '修改后的测试内容' WHERE id = 1; -- 查看 updated_at 已经自动更新为修改时间 SELECT * FROM current_timestamp_demos;
内容的提问来源于stack exchange,提问作者dokichan
相关产品推荐
相关产品推荐

