我在MySQL中有两个表,并希望定期将一个表中的新数据插入到另一个表中。举个例子:
create table src(n integer, m integer);
create table dst(n integer, m integer);
insert ignore into dst(n, m) select n, m from src;
但是,dst上没有键,所以这不起作用!此外,我无法创建任何密钥,因为我们有时希望允许其他进程创建重复项。
这是我现在如何完成它的方式;这似乎是一种黑客攻击方式,我担心它不会表现出色:
insert into dst(n, m)
select src.n, src.m
from src left outer join dst
on src.n = dst.n and src.m = dst.m
where dst.n is null and dst.m is null;
我已经在dst上创建了索引来帮助解决这个问题,但左外连接似乎仍然太重了。是否有更规范的方法来实现这一目标?
答案 0 :(得分:2)
只要您在(n,m)上有索引,性能就可以接受。 除此之外,您还可以这样做:
insert into dst(n, m)
select distinct src.n, src.m
from src
where NOT EXISTS (select 1 from dst D2 where src.n = D2.n and src.m = D2.m)
答案 1 :(得分:0)
设置多列索引:alter table YOURTABLE add unique index(n,m); Mysql manual reference to multi-column indexes
然后,您想要执行INSERT IGNORE,它将忽略现有索引列所在的任何插入。如果你想让新的副本更新记录,你可能想要INSERT ... ON DUPLICATE KEY UPDATE,但是从你的评论看,你看起来只是想要插入忽略。