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
相关产品推荐
相关产品推荐

