我在表中使用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;
答案 0 :(得分:0)
如何只将一列插入多列表?
长处理和锁定等待超时问题可能来自处理太多行而不是太多列。因此,一次执行一次列插入作业无法解决您的问题。
您需要一次处理更少的行。在不知道您的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'
检索,依此类推。您知道自己的数据,因此您可以了解如何分解批次。
答案 1 :(得分:0)
在插入之前尝试运行此isolation-level command,告诉MySQL不要等你的all_data表忙。
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;