Так что ситуация у меня такая. У меня есть 2 таблицы, одна для пользователей, а другая хранит электронную почту для этих пользователей. Таблица электронной почты связана с пользователями по внешнему ключу user_id. Я пытаюсь настроить систему архивирования, где пользователь может архивировать этих пользователей и хранить их в производственной базе данных. Но мне нужно удалить оригинал и заново вставить пользователя, чтобы дать ему новый идентификатор. Таким образом, они могут снова заархивировать позже, и данные не будут повреждены, и любая новая информация также будет заархивирована. Это всего лишь небольшой пример. Я делаю это с 10 таблицами, некоторые из которых связаны друг с другом. Объем данных может быть довольно большим, и при запуске архива это может занять несколько минут, поскольку для каждого пользователя я также проверяю, архивирую, удаляю и повторно вставляю этого пользователя. То, как я его сейчас настроил, может составить буквально несколько тысяч запросов для завершения всего архива.
Поэтому я пытаюсь переписать это так, чтобы количество запросов было ограничено одним. Получая всех пользователей, просматривая их и создавая запрос вставки, где я могу вставить много записей одним вызовом. Все отлично для пользователей, но когда я хочу сделать это для их электронных писем, я сталкиваюсь с проблемой. Поскольку я зацикливаюсь на пользователях, я сохраняю идентификатор (исходный идентификатор) в массиве, надеясь использовать его позже, чтобы обновить новые записи электронной почты с новым созданным user_id. Я могу получить первый идентификатор из моей большой вставки, и я знаю, сколько было записей, поэтому я знаю все новые идентификаторы. Я могу настроить цикл for для создания нового массива с новым идентификатором, таким образом совпадая с исходным массивом идентификатора.
Таким образом, вопрос в том, есть ли способ настроить оператор обновления, который бы позволял выполнять несколько операторов обновления за один вызов? Индексы из двух массивов будут совпадать.
update email_table
set user_id = {new_id_array}
where user_id = {old_id_array}
Я видел несколько разных вариантов, но ничего такого, что я пытался сделать. Любая помощь очень ценится.
Я думаю, что old_id <-> new_id
простой способ сделать то, что вам нужно, - это old_id <-> new_id
таблицу, содержащую отношения 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;
Но если вы все еще хотите что-то сделать с простыми списками, вам нужно сгенерировать запрос для манипуляции с ELT
и FIELD
:
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);
{old_id_array}
и{new_id_array}
? Возможно, у вас есть таблица, которая содержит его?