【发布时间】:2010-10-20 07:10:51
【问题描述】:
很多时候,我想对我的一个用户运行查询,我希望在其中存储一行并与该用户以一对一的关系关联。因此,假设(这只是一个任意示例),我有一个跟踪用户汽车的表格,以及有关汽车的一些信息。每个用户可以拥有 0 辆或 1 辆汽车。如果用户没有汽车,则表中没有该用户的条目。
汽车表(再次,只是一个例子): id, user_id, car_make, car_model
所以,当我更新这张表时,我总是会做这样的事情(伪代码):
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 语句应该运行的地方失败。而且我觉得我需要做两个相似(但不同)的陈述来完成同样的事情!我需要的是一些声明,可以确保我想要的数据存在于表中,尤其是当我只想要满足我要求的 1 行时。例如,它可能是这样的(当然这完全是虚构的):
MAKE SURE A ROW IN cars WHERE user_id=5 IS SET WITH car_make='toyota', car_model='prius'
这样,如果user_id为5已经存在,则更新,否则插入。此外,如果我更改了要求,例如说每个用户可以拥有零辆或一辆给定 car_make 的汽车,那么我可以进一步指定:
MAKE SURE A ROW IN cars WHERE user_id=5 AND car_make='toyota' IS SET WITH car_model='prius'
我希望我的问题是有道理的!我该如何改进这个经常出现的基本插入如果未找到或更新如果找到操作?感谢您的帮助!
【问题讨论】:
标签: mysql database-design upsert