首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从一个表插入一个列到多列表?

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

Stack Overflow用户
提问于 2018-05-22 18:27:02
回答 2查看 47关注 0票数 2

我在把插入到桌子上有一些困难。基本上,我运行了insert命令,得到:

“2013年错误代码”:查询期间丢失了与MySQL服务器的连接。

这是我的insert命令:

代码语言:javascript
复制
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:插入命令由于“锁定等待超时”而失败。

我的解决方案:杀死过程。之后,尝试一次添加一个列。

我的最后一个问题:如何只将一列从另一表插入到多列表?例如:

代码语言:javascript
复制
INSERT IGNORE INTO t1(a_id, b_id, c_id, d_id, e_id)
SELECT a_id FROM all_data;
EN

回答 2

Stack Overflow用户

发布于 2018-05-22 18:46:15

如何在多列表中只插入一列?

很可能长时间的处理和锁定等待超时问题来自于处理太多的行,而不是太多的列。因此,一次做一个列的插入工作并不能解决问题。

您需要一次处理较少的行。在不知道all_data表是否有主键的情况下,很难就此给出具体的建议。但是,假设您有一个名为primary_key_id的主键列,下面是这个过程的概要。

代码语言:javascript
复制
 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'等检索。你知道你的数据,所以你才是解决分批的人。

票数 0
EN

Stack Overflow用户

发布于 2018-05-22 19:00:12

尝试在插入之前运行此隔离级命令,告诉MySQL在all_data表繁忙时不要等待。

代码语言:javascript
复制
 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50474249

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档