如何只从一个表插入一列到多列表?

时间:2018-05-22 18:27:02

标签: mysql sql mysql-workbench

我在表中使用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 :(得分: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;