我有一个问题,从一个表插入数据到另一个表,它是一个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的帮助。
答案 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;
这将跳过任何会导致密钥违规的插入,但查询仍会运行(没有'忽略',它会在第一次违反密钥时失败。)