Mysql несколько обновлений в одном заявлении

0

Так что ситуация у меня такая. У меня есть 2 таблицы, одна для пользователей, а другая хранит электронную почту для этих пользователей. Таблица электронной почты связана с пользователями по внешнему ключу user_id. Я пытаюсь настроить систему архивирования, где пользователь может архивировать этих пользователей и хранить их в производственной базе данных. Но мне нужно удалить оригинал и заново вставить пользователя, чтобы дать ему новый идентификатор. Таким образом, они могут снова заархивировать позже, и данные не будут повреждены, и любая новая информация также будет заархивирована. Это всего лишь небольшой пример. Я делаю это с 10 таблицами, некоторые из которых связаны друг с другом. Объем данных может быть довольно большим, и при запуске архива это может занять несколько минут, поскольку для каждого пользователя я также проверяю, архивирую, удаляю и повторно вставляю этого пользователя. То, как я его сейчас настроил, может составить буквально несколько тысяч запросов для завершения всего архива.

Поэтому я пытаюсь переписать это так, чтобы количество запросов было ограничено одним. Получая всех пользователей, просматривая их и создавая запрос вставки, где я могу вставить много записей одним вызовом. Все отлично для пользователей, но когда я хочу сделать это для их электронных писем, я сталкиваюсь с проблемой. Поскольку я зацикливаюсь на пользователях, я сохраняю идентификатор (исходный идентификатор) в массиве, надеясь использовать его позже, чтобы обновить новые записи электронной почты с новым созданным user_id. Я могу получить первый идентификатор из моей большой вставки, и я знаю, сколько было записей, поэтому я знаю все новые идентификаторы. Я могу настроить цикл for для создания нового массива с новым идентификатором, таким образом совпадая с исходным массивом идентификатора.

Таким образом, вопрос в том, есть ли способ настроить оператор обновления, который бы позволял выполнять несколько операторов обновления за один вызов? Индексы из двух массивов будут совпадать.

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

Я видел несколько разных вариантов, но ничего такого, что я пытался сделать. Любая помощь очень ценится.

  • 2
    tldr. Это может быть полезно: stackoverflow.com/questions/3432/multiple-updates-in-mysql
  • 0
    каков источник {old_id_array} и {new_id_array} ? Возможно, у вас есть таблица, которая содержит его?
Теги:

1 ответ

0

Я думаю, что 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);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню