首页 > 解决方案 > INSERT … ON DUPLICATE KEY UPDATE with Condition

问题描述

我的表有 Cas 字段,我想在保存操作中实现 CompareAndSet

这是我的sql代码

INSERT INTO `test_cas_table`(id,name,cas) VALUES(3, "test data", 2) 
  ON DUPLICATE KEY UPDATE 
    id = VALUES(id),
    name = VALUES(name),
    cas = IF(cas = VALUES(cas) - 1, VALUES(cas) , "update failure")

因为 cas 字段是 BIGINT,什么时候cas != VALUES(cas) - 1将其设置为“更新失败”会导致此执行失败

但是这种方式太丑了,有没有漂亮的实现?

我想知道postgresql有漂亮的实现吗?

我想在一次执行中实现它

标签: mysql

解决方案


您的身份列是自动生成的吗?如果是这样,则无需检查重复项。只需插入您的新信息,您的数据库就会处理它。

但是,如果您有一个不是自动生成的身份列(例如电子邮件或官方文档,而不是自动递增的整数主键),您需要首先查询您的数据库以查找您将要保留的值。这样,您不会收到 SQLException (Java),而是检查您的查询结果并告诉用户更改其电子邮件或官方文档(如果它已被其他用户使用)。


推荐阅读