MySQL Update set仅在flag = 0时设置值

时间:2013-09-30 13:37:13

标签: mysql sql

我有这个查询:

INSERT INTO `items` (`id`,`image`)
   VALUES(112,'asdf.jpg'),(113,'foobar.png')
ON DUPLICATE KEY UPDATE
  `id`VALUES(`id`),
  `image` = IF(image_uploaded = 0, VALUES(`image`),image);

更糟糕的是:它正常工作但不是我想要的。

我想要的:只有当“image_uploaded”字段设置为0时才应更新图像。

有什么想法吗?

背景:我有一个包含数据的数据库表。现在每天晚上一个cronjob调用API-Fn从另一个DB获取新数据并将其写入我的表。此函数从第二个DB获取所有项目,因此它当前只覆盖我现有的数据。现在我的应用程序允许更改从第二个数据库获得的数据并覆盖我自己的表中的更改。所以问题是:我需要能够通过我的应用程序编辑数据并通过API更新数据而不会发生冲突。用户可以更改“图像”,但所有其他内容应该从第二个DB更新。如果图像未手动上传,则只应覆盖图像。

1 个答案:

答案 0 :(得分:2)

没有玩ON DUPLICATE KEY...我不确定,是否可以处理这种情况。我会通过使用另一个(临时)表来解决它。

它与target_table和一个列(在示例sid中)的结构相同,以指示该条目是否存在于target_table中。

CREATE TEMPORARY TABLE tmp_whatever (
sid int,
id int, image varchar(50)
);

现在我们首先将要插入到target_table中的数据插入到新创建的表中,如果条目已存在,则使用coalesce()和left join进行检查。我在这里假设,id是你的主键。

INSERT INTO tmp_whatever (sid, id, image)
SELECT 
COALESCE(t.id, 0),
id, image 
FROM (
  SELECT 112 AS id,'asdf.jpg' AS image
  UNION ALL
  SELECT 113,'foobar.png'
) your_values v
LEFT JOIN your_target_table t ON v.id = t.id;

然后我们更新target_table ......

UPDATE your_target_table t INNER JOIN tmp_whatever w ON t.id = w.id AND w.sid <> 0 
SET t.image = w.image
WHERE t.image_uploaded = 0;

最后我们插入不存在的行......

INSERT INTO your_target_table (id, image)
SELECT
id, image 
FROM tmp_whatever
WHERE sid = 0;

当我写这篇文章时,我想到了,我可能对你的问题有错误的假设。此

  

更糟糕的是:它正常工作但不是我想要的。

绝对不是提出问题或描述问题的方式。我回答是因为我有一个美好的一天:)(这就是你得到downvotes的原因,顺便说一句)
无论如何,“不是我想要的”的另一个原因可能是,你错过了表中的唯一索引。虽然主键是唯一键,但afaik / iirc ON DUPLICATE KEY依赖于另一列上的唯一索引才能正常工作。