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

MySQL如何单请求实现仅递增int版本字段的插入/更新校验

单请求实现版本递增校验的方案

可以通过修改INSERT ON DUPLICATE KEY UPDATE语句,在更新逻辑中加入版本校验,实现单请求完成插入/更新且仅允许version递增的需求,具体方案如下:

推荐SQL语句

INSERT INTO my_table (id, data, version) VALUES (:id, :data, :new_version)
ON DUPLICATE KEY UPDATE
  data = IF(version < :new_version, :data, data),
  version = IF(version < :new_version, :new_version, version)

逻辑说明

  • 当id不存在时,直接插入新记录,包含传入的id、data和version。
  • 当id已存在时,仅在现有记录的version小于传入的new_version时,才更新data和version为新值;如果现有version大于等于传入值,则保持原字段不变,相当于不执行更新操作。

为什么不推荐REPLACE INTO

REPLACE INTO的逻辑是先删除旧记录再插入新记录,无法在删除前校验旧记录的version值,因此无法实现版本递增的校验需求,建议放弃使用这种方式。

备选方案:触发器

如果希望通过字段规则强制version递增,可以创建触发器在更新时校验版本:

DELIMITER //
CREATE TRIGGER check_version_increment BEFORE UPDATE ON my_table
FOR EACH ROW
BEGIN
  IF NEW.version <= OLD.version THEN
    SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Version must be greater than current';
  END IF;
END //
DELIMITER ;

然后配合原有的INSERT ON DUPLICATE KEY UPDATE语句使用,当传入的version不符合递增要求时,触发器会抛出错误,阻止更新。不过触发器会增加数据库维护成本,且不如直接在SQL语句中加入条件灵活,因此优先推荐第一种方案。

内容的提问来源于stack exchange,提问作者gad_gadskiy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 00:15:06