从mysql中的另一个表INSERT或UPDATE

时间:2014-04-11 18:59:04

标签: mysql sql

我有两个表,具有相同的架构 -

create table test1 (
a INT NOT NULL ,
b INT NOT NULL ,
c INT,
PRIMARY KEY (a,b)
);

create table test2 (
a INT NOT NULL ,
b INT NOT NULL ,
c INT,
PRIMARY KEY (a,b)
);

我想将test2表中的值插入test1,但如果已经存在具有相同主键的行,请更新它。我知道在mysql中你可以用ON DUPLICATE KEY UPDATE做类似的事情,比如 -

INSERT INTO test1 VALUES (1,2,3)
ON DUPLICATE KEY UPDATE c=3;

但我不知道如何使用另一个表中的SELECT执行上述查询。我正在寻找的是形式的查询 -

INSERT INTO test2 
SELECT a, b, c FROM test1
ON DUPLICATE KEY UPDATE c = c + t.c 
(Select a, b, c from tests1)t;

此查询显然无效。如果有人可以提出有效的查询,我将不胜感激。

3 个答案:

答案 0 :(得分:2)

您可以使用此SQL执行此操作:

INSERT INTO test1 (a, b, c) 
    SELECT t.a as a, t.b as b, t.c AS c FROM test2 AS t
ON DUPLICATE KEY UPDATE c=t.c;

答案 1 :(得分:1)

这应该适合你:

INSERT INTO test2 
SELECT a, b, c as c1 FROM test1
ON DUPLICATE KEY UPDATE c = c + c1

答案 2 :(得分:0)

这取决于我使用PK自动递增功能,对于行唯一标识符,我拆分了一个大表,所以小的表有我不能错过的更改,我读了一些意见,甚至合并并重新制作了不起作用的PK为了我。如果您不提及完整的列名,则在“内存”中设置的结果看起来会出错。我这样做并工作,希望某些机构提供更好和更小的解决方案:

>INSERT
>INTO    t_traffic_all 
>SELECT  
>t_traffic.file_id,
>t_traffic.cust,
>t_traffic.supp,
>.
>. (a lot...)
>.
>t_traffic.i_traffic_type,
>t_traffic.date_posted,
>t_traffic.date_update
>FROM    t_traffic 
>ON DUPLICATE KEY UPDATE 
>t_traffic_all.file_id =    t_traffic.file_id,
>t_traffic_all.cust =   t_traffic.cust,
>t_traffic_all.supp =   t_traffic.supp,
>t_traffic_all.imprt =  t_traffic.imprt,
>.
>.
>.
>t_traffic_all.i_traffic_type=  t_traffic.i_traffic_type,
>t_traffic_all.date_posted= t_traffic.date_posted,
>t_traffic_all.date_update= t_traffic.date_update
> Affected rows: 11128
> Time: 29.085s

在18608处处理的总行数,因此它插入11128并更新7480(应为7554),这个数字不是很精确,但是结果是。

相关问题