mysql - 在不存在时插入,但在条件存在时更新

标签 mysql sql

我知道 REPLACEON DUPLICATE UPDATE,问题是我想在我的员工存在时插入,并在存在时更新一些列,但基于条件。

例如:我的表格列

Id(Auto Generated), EmpId, EmpName, Salary, Version
12                  ABW72  John     1000    100

EmpId 不是主键,但有一个Unique Index

现在如果 ABW72 不存在,INSERT 就可以了 和 UPDATE 如果 EmpId = ABW72 仅当 version > 20 时存在。此版本是存储在数据库中的版本。如何在 MySql 中做到这一点。

我们在应用程序方面尝试了这样的事情:

Step 1: Select with a lock on EmpId=ABW72. A lock would be taken if it exists.
Step 2: If Step1 returned 0 records, Insert Ignore OR Insert
Step 2: If Step1 returned 1 record, just update based on the condition.

这里的问题出在第 2 步,因为如果使用 Insert 会导致高并发加载异常,而 Insert Ignore 会导致错过有效更新。

最佳答案

您可以在 on duplicate key update 子句中使用条件表达式。这是一个例子:

insert into mytable(EmpId, EmpName, Salary, Version)
    values ($EmpId, $EmpName, $Salary, $Version)
    on duplicate key update
        EmpName = (case when Version > 20 then Values(EmpName) else EmpName end),
        Salary = (case when Version > 20 then Values(Salary) else Salary end);

关于mysql - 在不存在时插入,但在条件存在时更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35133752/

相关文章:

php - 加入表后不从数据库中检索行

sql - SSIS 表达式转 SQL 语句

mysql - 从多个表中获取行

mysql - 如何自动将列值更改为另一列的子字符串值

mysql - 来自另一个表的有限时间范围的聚合

PHP与MySQL对比数据

sql - 在 90 或更高版本的兼容模式下,ORDER BY 子句中不允许使用常量表达式

mysql - 将字段的默认值设置为 auto_increment 值

MYSQL - 根据动态值选择

mysql - 主/从 Mysql 架构与服务器/读取数据库和仅用于写入的单独数据库