2014-04-07 76 views
0

我有两个表中的MySQL,并希望定期从一个到另一个插入新的数据。举个例子:插入唯一的非重复到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没有钥匙,所以这也不行!此外,我无法创建任何密钥,因为我们有时希望允许其他进程创建重复项。

下面是我怎么现在做到了;这似乎是一个黑客十岁上下的解决方法,我很担心它会不会高性能:在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; 

我创建索引来解决这个问题,而是一个左外连接还是显得太重量级。是否有更经典的方法来实现这一目标?

回答

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) 
0

设置一个多列索引:ALTER TABLE YOURTABLE添加唯一索引(N,M); Mysql manual reference to multi-column indexes

然后你想要做一个INSERT忽略那些会忽略在现有的索引列中存在任何插入。如果您希望新的副本更新记录,您可能需要执行INSERT ... ON DUPLICATE KEY UPDATE,但是从您的评论看来,您似乎只想插入忽略。

相关问题