CockroachDB中SQL Server RowVersion的等效实现方案咨询
解决方案
针对你在CockroachDB中替代SQL Server RowVersion的需求,这里提供两种完全由数据库层面自动处理的实现方案,无需代码层干预,也不需要触发器:
方法1:基于ON UPDATE的随机版本戳
直接利用CockroachDB的ON UPDATE列属性,结合内置函数实现创建自动生成、更新自动变更的随机版本值:
CREATE TABLE your_table ( id INT PRIMARY KEY, -- 替换为你的业务列 username STRING, email STRING, -- 模拟RowVersion的核心字段 row_version BYTES DEFAULT uuid_v4()::BYTES ON UPDATE uuid_v4()::BYTES );
关键说明
uuid_v4()::BYTES生成随机二进制值,对应原RowVersion的随机增量特性- 创建记录时,
row_version会自动赋值;每次执行UPDATE操作修改记录时,该字段会自动重新生成新的随机二进制值 - 该字段不作为主键,完全满足你的需求
如果需要递增而非随机的版本号,可以改用序列实现:
-- 先创建序列 CREATE SEQUENCE row_version_seq START 1 INCREMENT 1; -- 创建表时关联序列 CREATE TABLE your_table ( id INT PRIMARY KEY, username STRING, email STRING, row_version INT DEFAULT nextval('row_version_seq') ON UPDATE nextval('row_version_seq') );
方法2:基于时间戳哈希的版本戳
如果需要更贴近原RowVersion的二进制格式,且依赖更新时间触发版本变更,可以用辅助时间戳列生成哈希值:
CREATE TABLE your_table ( id INT PRIMARY KEY, username STRING, email STRING, -- 隐藏的辅助更新触发列,不会被SELECT *返回 _update_time TIMESTAMP DEFAULT now() ON UPDATE now() INVISIBLE, -- 基于时间戳生成的二进制版本号 row_version BYTES GENERATED ALWAYS AS (sha256(_update_time::BYTES)) STORED );
关键说明
_update_time是隐藏列,每次更新记录时会自动刷新为当前时间row_version通过哈希时间戳生成二进制值,确保每次更新都会变化,格式接近原RowVersion- 辅助列用
INVISIBLE标记,避免干扰业务查询
验证方法
执行更新操作后,直接查询记录即可验证row_version是否自动变更:
UPDATE your_table SET username = 'new_name' WHERE id = 1; SELECT id, row_version FROM your_table WHERE id = 1;
内容的提问来源于stack exchange,提问作者Aiyuni
相关产品推荐
相关产品推荐

