首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL如果未找到则插入行,或如果找到则更新行的“好”方法

问MySQL如果未找到则插入行,或如果找到则更新行的“好”方法
EN

Stack Overflow用户
提问于 2009-04-18 15:05:34
回答 7查看 22.4K关注 0票数 17

通常,我希望在我的一个用户上运行一个查询,其中我希望以一对一的关系存储一行并与该用户相关联。因此,假设(这只是一个随意的例子),我有一个表,它跟踪用户的汽车,以及关于汽车的一些信息。每个用户可以拥有0辆或1辆汽车。如果用户没有汽车,则表中没有该用户的条目。

cars表(同样,只是一个例子):id,user_id,car_make,car_model

所以,当我更新这个表时,我总是会这样做(伪代码):

代码语言:javascript
复制
result = SELECT * FROM cars WHERE user_id=5
if (num_rows(result)>0){
    UPDATE cars SET car_make='toyota', car_model='prius' WHERE user_id=5
}else{
    INSERT INTO cars (user_id, car_make, car_model) VALUES (5, 'toyota', 'prius')
}

我怎样才能把它变成一个优雅的“原子”语句呢?如果在另一个进程中,SELECT和UPDATE语句之间的行被删除,会发生什么情况?我的UPDATE语句将在INSERT语句本应运行的位置失败。我觉得我需要做两个相似的(但不同的)语句来完成同样的事情!我需要的是一些语句来保证我想要的数据存在于表中,特别是当我只想要满足我需求的一行时。例如,它可能是这样的(当然这完全是虚构的):

代码语言:javascript
复制
MAKE SURE A ROW IN cars WHERE user_id=5 IS SET WITH car_make='toyota', car_model='prius'

这样,如果5的user_id已经存在,它将被更新,否则将被插入。此外,如果我更改了需求,例如,假设每个用户可以拥有给定car_make的零辆或一辆汽车,那么我可以进一步指定:

代码语言:javascript
复制
MAKE SURE A ROW IN cars WHERE user_id=5 AND car_make='toyota' IS SET WITH car_model='prius'

我希望我的问题有意义!如何改进这个经常出现的基本insert-if-found或update-if-found操作?谢谢你的帮助!

EN

回答 7

Stack Overflow用户

发布于 2009-04-18 15:12:53

您可以使用"REPLACE INTO“或"INSERT… ON DUPLICATE KEY UPDATE”。我相信第二个是您想要的,但在某些情况下,替换INTO是很方便的。

票数 17
EN

Stack Overflow用户

发布于 2009-06-25 02:26:15

来自my other Stack Overflow answer

如果您希望在单个语句中完成此操作,我建议您使用INSERT ... ON DUPLICATE KEY UPDATE语法,如下所示:

代码语言:javascript
复制
INSERT INTO table (id, someothervalue) VALUES (1, 'hi mom')
  ON DUPLICATE KEY UPDATE someothervalue = 'hi mom';

如果不存在具有指定键值(主键或唯一键)的现有记录,则将执行初始INSERT语句。如果记录已经存在,则执行以下UPDATE语句(someothervalue = 3)。

这在所有版本的MySQL中都受支持。有关更多信息,请参阅MySQL Reference Manual page for INSERT ... ON DUPLICATE KEY UPDATE

票数 7
EN

Stack Overflow用户

发布于 2009-04-18 15:12:15

这就是所谓的UP_date( in_SERT)。你可以搜索一些关于它的SO问题。See Wikipedia

编辑: MySQL 4.1+支持INSATE (INS_ert或upd_ATE),只要您有一个主键,就应该可以得到相同的结果。MySQL Manual

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/763577

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档