MySQL在一条语句中进行多次更新

时间:2019-02-01 20:48:20

标签: php mysql

所以我的情况就是这样。我有2个表,一个表用于用户,其他表用于存储那些用户的电子邮件。电子邮件表通过外键user_id与用户相关。我正在尝试建立一个存档系统,用户可以在其中存档这些用户并将其保留在生产数据库中。但是我需要删除原始文件,然后重新插入用户以为其提供新的ID。这样,他们以后就可以再次存档,数据也不会损坏,任何新信息也将被存档。这只是一个小例子,我实际上是用10个表来完成的,其中一些表彼此相关。涉及的数据量可能非常大,并且归档开始时可能需要几分钟才能完成,因为我还要为每个用户检查,归档,删除和重新插入该用户。我现在设置的方式实际上可以有1000个查询来完成完整的归档。

因此,我试图重新编写此代码,以便将查询调用的次数限制为一个。通过吸引所有用户,遍历他们并构建一个插入查询,在此我可以通过一个调用插入许多记录。一切对用户来说都很不错,但是当我想为他们的电子邮件这样做时,我遇到了问题。在遍历用户时,我将ID(原始ID)保存到数组中,希望以后使用它使用创建的新user_id更新新电子邮件记录。我可以从大插入物中获得第一个ID,而且我知道有多少记录,所以我知道所有新ID。我可以设置一个for循环来创建一个具有新ID的新数组,从而与原始ID数组匹配。

所以问题是,是否有一种方法可以建立一个允许在一个调用中包含多个更新语句的更新语句?两个数组的索引将匹配。

update email_table
set user_id = {new_id_array}
where user_id = {old_id_array}

我已经看到了几种不同的选择,但是没有任何事情可以做我想做的。非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

做我认为最简单的方法是拥有一些包含old_id <-> new_id关系的表。

一旦您在数据库中某处保存了数据,您只需加入:

https://www.db-fiddle.com/f/bYump2wDn5n2hCxCrZemgt/1

UPDATE email_table e
JOIN replacement r
ON e.user_id = r.old_id
SET e.user_id = r.new_id;

但是,如果您仍然想对普通列表做一些事情,则需要生成查询以使用ELTFIELD进行操作:

https://www.db-fiddle.com/f/noBWqJERm2t399F4jxnUJR/1

UPDATE email_table e
SET e.user_id = ELT(FIELD(e.user_id, 1, 2, 3, 5), 7, 8, 9, 10)
WHERE e.user_id IN (1,2,3,5);