在SQL错误1206中插入一个巨大的表

时间:2013-12-04 12:41:47

标签: mysql database

我有一个问题,从一个表插入数据到另一个表,它是一个MySQL数据库。必须导入的表大约4gb。我正在使用此查询导入数据。

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;

谢谢Tom Melly的回答。 谢谢Stefan Winkler的帮助。

2 个答案:

答案 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子句。只是为了确保排序顺序一致。

答案 1 :(得分:0)

column1上有唯一索引吗?

如果是这样,您可以在插入中添加ignore选项,这意味着您可以跳过左连接:

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

这将跳过任何会导致密钥违规的插入,但查询仍会运行(没有'忽略',它会在第一次违反密钥时失败。)