You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 00:17:16