Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何仅将一个表中的一列插入到多列表中?_Mysql_Sql_Mysql Workbench - Fatal编程技术网

Mysql 如何仅将一个表中的一列插入到多列表中?

Mysql 如何仅将一个表中的一列插入到多列表中?,mysql,sql,mysql-workbench,Mysql,Sql,Mysql Workbench,在表中使用INSERT时遇到一些问题。基本上,我运行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; 对于这个问题,我尝试增加连接超时时间 然而,在那之后,我得到: 超过锁定等待超时;尝试重新启动事务 我已尝试终止所有可能的进程。没有

在表中使用INSERT时遇到一些问题。基本上,我运行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;医生:

问题1:Insert命令因“查询期间与MySQL服务器的连接丢失”而失败

我的解决方案:增加连接超时时间

问题2:插入命令因“超过锁定等待超时”而失败

我的解决方案:终止进程。之后,尝试一次添加一列

我的最后一个问题:如何只将另一个表中的一列插入到多列表中?e、 g

INSERT IGNORE INTO t1(a_id, b_id, c_id, d_id, e_id)
SELECT a_id FROM all_data;
如何在多列表中只插入一列

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

您需要一次处理更少的行。如果不知道您的
all_data
表是否有主键,就很难给出具体的建议。但是,假设您有一个名为
primary\u key\u 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名称(如“%A”
)检索,第二批将使用
WHERE名称(如“%B”
)检索,依此类推。您知道自己的数据,因此您是解决如何分解批处理的人。

在插入之前尝试运行此命令,告诉MySQL如果您的所有数据表都很忙,不要等待

 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

这里似乎有两个问题,除非我误解了。1) 为什么insert是死锁或超时的,以及2)如何仅将一个值插入到具有多列的表中。
insert into t1(a_id)从所有_数据中选择一个_id插入t1(a_id,b_id,c_id,d_id,e_id)从所有数据中选择a_id,0,0,0,0(我假设这些都是数字/整数)谢谢,这是非常有见地的。我没有想到我可能需要减少行而不是列。但是,并非所有_数据都有主键。还有其他方法吗?主键只是处理insert中成批数据的一种方便方法。您可以使用
a_id介于0和999之间,然后
a_id介于1000和1999之间等方式创建批处理。很抱歉,但我不确定是否遵循了。这不是只有在我的身份证号码开始时才有效吗?