不使用密钥只将非重复项插入MySQL表

时间:2014-04-07 20:57:05

标签: mysql sql

我在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上创建了索引来帮助解决这个问题,但左外连接似乎仍然太重了。是否有更规范的方法来实现这一目标?

2 个答案:

答案 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,但是从你的评论看,你看起来只是想要插入忽略。