MySQL内部联接使用非唯一ID

时间:2017-07-27 07:12:27

标签: mysql inner-join

我想使用内连接

从另一个表更新我的表

查询:

UPDATE XYZ INNER JOIN ABC on ABC.Id = XYZ.Id
       SET XYZ.Std = ABC.Std  

示例数据:

表XYZ

           ID                                                          STD

401471  QWERTY1     0   13.381  2013-01-01 00:00:00 2002-06-01 00:00:00 0   0   0   2002-06-01 00:00:00 2005-05-31 00:00:00 
401472  QWERTY2     0   13.488  2013-01-04 00:00:00 2002-06-01 00:00:00 0   0   0   2002-06-01 00:00:00 2005-05-31 00:00:00 
401473  QWERTY3     0   13.465  2013-01-07 00:00:00 2002-06-01 00:00:00 0   0   0   2002-06-01 00:00:00 2005-05-31 00:00:00 

表ABC

ID                                              STD Q  W

QWERTY1 2002-06-01 00:00:00 2005-05-31 00:00:00 0   0   0
QWERTY2 2002-07-01 00:00:00 2005-06-30 00:00:00 0   0   0
QWERTY3 2002-08-01 00:00:00 2005-07-31 00:00:00 0   0   0

ID不是主键,我有超过1.5百万条带有重复ID的记录,因为日期不同而重复了。

所以我的查询无效,因为连接丢失错误2013,我尝试将超时从600更改为6000,但无法工作,因为我无法更改云中的数据库服务器的超时。

任何人都可以告诉我,如果查询是正确的,如果是,为什么连接会丢失?

如果查询正确,我可以在块中进行吗?

3 个答案:

答案 0 :(得分:0)

试试这个 -

UPDATE XYZ
set XYZ.std = ABC.std
from XYZ inner join ABC on XYZ.id = ABC.id

答案 1 :(得分:0)

查询可能需要很长时间才能执行,这就是为什么你会超时。您可以通过在查询中设置范围来执行此操作:

UPDATE XYZ 
    INNER JOIN ABC on ABC.Id = XYZ.Id
    SET XYZ.Std = ABC.Std
    WHERE ABC.Id between 1 AND 50000;

您可以使用任何其他参数来创建块,上面的查询只是一个示例。

答案 2 :(得分:0)

你可以这样做:

UPDATE XYZ INNER JOIN ABC on ABC.Id = XYZ.Id
       SET XYZ.Std = ABC.Std;
MySQL中的

as desicribed here)但它不是本机ANSI SQL

您是否在id列上设置了索引? 你不必把它作为主要的,但应该有一个索引。