2013-12-04 4 views
1

У меня проблема с вставкой данных из одной таблицы в другую, это база данных MySQL. Стол, который должен быть импортирован, составляет около 4 ГБ. Я использую этот запрос для импорта данных.Вставить огромную таблицу в ошибку SQL 1206

insert into table1(column1, column 2) 
select table2.column1, table2.column2 
from table2 left join table1 on table2.column1 = table1.column1 
where table1.column1 is null 

Я получаю эту ошибку: Код ошибки 1206: общее количество замков превышает размер таблицы блокировок.

Увеличение размера пула буферов не является вариантом, у меня нет прав на это. SQL-запрос работает с меньшими таблицами.

У кого-нибудь есть решение для моей проблемы?

Решение:

insert IGNORE into table1(column1, column 2) 
select table2.column1, table2.column2 
from table2; 

Спасибо Том Мелли за ответ. Спасибо, Стефан Винклер за помощь.

ответ

0

Есть ли уникальный указатель на столбце1?

Если да, то вы можете добавить опцию игнорирования для вашей вставки, который будет означать, вы можете пропустить левое соединение:

insert IGNORE into table1(column1, column 2) 
select table2.column1, table2.column2 
from table2; 

Это будет пропускать любые вставки, которые создают ключ-нарушение, но запрос (без «игнорирования» он будет терпеть неудачу при первом нарушении ключа).

+0

Привет, в столбце есть уникальный индекс. Я пробовал это раньше, но каким-то образом данные не были вставлены. Часть 2 таблиц - это наложение, это был один большой Перед тем как придумать, что может привести к тому, что вставка IGNORE не будет вставлена? – Kevin

+0

Nevermind, как-то это сработало сейчас :) спасибо, сэр! – Kevin

+0

«Я ничего не менял»;) –

0

Будет ли вариант разделения на меньшие партии (например, блоков 1000)?

insert into table1(column1, column 2) 
select table2.column1, table2.column2 
from table2 left join table1 on table2.column1 = table1.column1 
where table1.column1 is null 
limit 1000 

insert into table1(column1, column 2) 
select table2.column1, table2.column2 
from table2 left join table1 on table2.column1 = table1.column1 
where table1.column1 is null 
limit 1000,1000 

insert into table1(column1, column 2) 
select table2.column1, table2.column2 
from table2 left join table1 on table2.column1 = table1.column1 
where table1.column1 is null 
limit 2000,1000 

-- etc. 

Может быть, вы должны также добавить order by пункт к select в этом случае. Просто убедитесь, что порядок сортировки согласован.

+0

Привет, спасибо за ваш ответ. Это не работает, я пробовал его с номерами от 1 до 100 000, и я продолжаю получать ту же ошибку. Добавление заказа не делает этого. – Kevin

+0

mhhh ... это плохо :-(- Я также думал об использовании LOCK TABLES/UNLOCK TABLES для блокировки таблиц явно. Возможно, это вызывает блокировку всей таблицы вместо отдельных строк, и, таким образом, количество блокировок строк не является но я еще не использовал LOCK TABLES, и поэтому могу только догадываться ... –

+0

Блокировка таблиц с помощью: блокировки таблиц table1 write, table2 read; запрос, разблокировка таблиц, по-прежнему дает мне ту же ошибку. Также попытался ограничить запрос заблокированными таблицами, та же ошибка – Kevin

Смежные вопросы