Как вставить только один столбец из одной таблицы в таблицу с несколькими столбцами? - PullRequest
0 голосов
/ 22 мая 2018

У меня возникли проблемы с использованием INSERT в таблице.По сути, я запускаю команду вставки и получаю:

Код ошибки 2013: потеря соединения с сервером MySQL во время запроса.

Это моя команда вставки:

INSERT IGNORE INTO t1(a_id, b_id, c_id, d_id, e_id)
SELECT t1 a_id, b_id, c_id, d_id, e_id FROM all_data;

Для этой проблемы я пытаюсь увеличить время ожидания соединения.

Однако после этого я получаю:

Превышено время ожидания блокировки;попробуйте перезапустить транзакцию

Я попытался убить все возможные процессы.Без какого-либо успеха.Не говоря уже о том, что если вы увеличите время ожидания, тогда процесс уничтожения может занять в 30 раз больше времени, чем выполнение запроса.

Я думаю, что моим решением этой проблемы было бы попытаться добавить меньше данныхвовремя.Следовательно, мой вопрос, как вставить только один столбец в таблицу с несколькими столбцами?

TL; DR:

Проблема 1: Команда вставкипроисходит сбой из-за «Потеря соединения с сервером MySQL во время запроса»

Мое решение: Увеличение времени ожидания соединения.

Проблема 2: ВставкаСбой команды из-за «Превышено время ожидания блокировки».

Мое решение: Убить процессы.После этой попытки добавить один столбец за раз.

Мой последний вопрос: Как вставить только один столбец из другой таблицы в таблицу с несколькими столбцами?например,

INSERT IGNORE INTO t1(a_id, b_id, c_id, d_id, e_id)
SELECT a_id FROM all_data;

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Попробуйте выполнить эту команду уровня изоляции перед вставкой, чтобы запретить MySQL ждать, если таблица all_data занята.

 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
0 голосов
/ 22 мая 2018

как вставить только один столбец в таблицу с несколькими столбцами?

Вероятно, из-за обработки слишком много строк * 1006 возникают проблемы с длительным ожиданием обработки и ожиданием блокировки* вместо слишком много столбцов .Поэтому выполнение задачи вставки столбца за раз не решит вашу проблему.

Вам нужно обрабатывать меньше строк одновременно.Трудно дать вам конкретный совет по этому поводу, не зная, имеет ли ваша таблица all_data первичный ключ.Но вот схема процесса, предполагающая, что у вас есть столбец первичного ключа с именем primary_key_id.

 SET @last_id := -1;

 INSERT IGNORE INTO t1( a_id, b_id, c_id, d_id, e_id)
 SELECT a_id, b_id, c_id, d_id, e_id 
   FROM all_data
  WHERE primary_key_id > @last_id
  ORDER BY primary_key_id
  LIMIT 1000

 SELECT MAX(primary_key_id) INTO @last_id 
   FROM all_data
  WHERE primary_key_id > @last_id
  ORDER BY primary_key_id
  LIMIT 1000

Затем повторяйте второй и третий запросы, пока второй запрос не вставит никаких строк.

Я установил 1000 в качестве размера партии.Возможно, вы сможете использовать что-то большее или меньшее.

Если вы не можете использовать первичный ключ, вы можете рассмотреть возможность разделения пакетов другим способом.Может быть, например, по первой букве имени.Первая партия будет извлечена с использованием WHERE name LIKE '%A', вторая с помощью WHERE name LIKE '%B' и так далее.Вы знаете свои данные, поэтому вы должны выяснить, как разбить ваши партии.

...