我有两个表,具有相同的架构 -
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;
此查询显然无效。如果有人可以提出有效的查询,我将不胜感激。
答案 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),这个数字不是很精确,但是结果是。