MySQL:如果值存在,则对行进行更新,如果值不存在,则插入 [重复]

Posted

技术标签:

【中文标题】MySQL:如果值存在,则对行进行更新,如果值不存在,则插入 [重复]【英文标题】:MySQL: If values exist do an update on the row, if values do not exist do an insert [duplicate] 【发布时间】:2019-02-16 15:26:34 【问题描述】:

我需要一个 sql 语句,如果行存在则更新,如果行不存在则插入。 我有一个包含以下值的表...

id 是(唯一 + 自动递增)

id | selectedID | userID  | question
------------------------------------
1  |    1       |   3     |   10

如果用户 ID 为 3 的用户选择了不同的 selectedID,例如2 对于问题 10,我希望表格更新为:

id | selectedID | userID  | question
-----------------------------------
1  |    2       |   3     |   10

如果用户 ID 为 3 的用户再次为问题 10 选择 selectedID 2,我不希望它插入另一行。

如果 id 为 3 的用户为问题 11 选择了一个 selectedID,我希望它插入一个新行,例如第 11 题的 2:

id | selectedID | userID  | question
-----------------------------------
1  |    2       |   3     |   10
2  |    2       |   3     |   11

【问题讨论】:

您的问题是什么?你的代码在哪里?你被困在哪里了?请阅读:How to create a Minimal, Complete, and Verifiable example 和 How do I ask a good question? 【参考方案1】:

您正在寻找insert on duplicate key update

基本上,您希望(userId, questionId) 的组合是唯一的。首先设置一个唯一的约束/索引:

create unique index unq_t_userId_questionId on t(userId, questionId);

然后使用on duplicate key update 插入:

insert into t (userId, questionId, selectedId)
    values (@userId, @questionId, @selectedId)
    on duplicate key update selectedId = values(selectedId);

【讨论】:

工作完美感谢@GordonLinoff!【参考方案2】:

INSERT on duplicate key

您可以在 mysql 中使用上述构造,如果存在键,则更新记录,如果未找到主键进行插入。 MERGE 在甲骨文中做了一些事情。

如果您在 INSERT 中指定 ON DUPLICATE KEY UPDATE 选项 语句和新行导致 UNIQUE 中的重复值或 PRIMARY KEY索引,MySQL根据旧行更新 新的价值观。

【讨论】:

以上是关于MySQL:如果值存在,则对行进行更新,如果值不存在,则插入 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Excel公式,如果一列中存在重复且另一列中存在特定文本,则对列进行求和

WordPress 和 SQL - 如果列值不存在,则从另一个表更新和插入

java set重复值是不存还是覆盖

如果记录存在,Oracle 存储过程会更新行

Oracle SQL:所有行大于值(如果值存在)或所有行小于值(如果值不存在)

Mysql如果某个字段值存在则更新另一个字段的值为原值+100,命令应该如何写?