-1

我有这个查询:

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 从另一个数据库获取新数据并将其写到我的表中。此功能正在从第二个数据库中获取所有项目,因此它目前只是覆盖我现有的数据。现在我的应用程序允许更改我从第二个数据库获得的数据并覆盖我自己的表中的更改。所以问题是:我需要能够通过我的应用程序编辑数据并通过 API 更新数据而不会发生冲突。用户可以更改“图像”,但所有其他内容应从第二个数据库更新。仅当未手动上传图像时才应覆盖该图像。

4

1 回答 1

2

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

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

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

现在我们首先将要插入到 target_table 中的数据插入到新创建的表中,并使用 coalesce() 检查并左连接,如果该条目已经存在。我在这里假设,该 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;

当我写下来的时候,我想到了,我可能对你的问题有错误的假设。这个

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

绝对不是提出问题或描述问题的方式。我回答是因为我今天过得愉快 :) (这就是你投反对票的原因,顺便说一句)
无论如何,“不是我想要的”的另一个原因可能是你的表中缺少一个唯一索引。尽管主键是唯一键,但 afaik/iircON DUPLICATE KEY依赖于另一列上的唯一索引才能正常工作。

于 2013-09-30T14:22:59.783 回答