我知道如何使用insert into将一行值插入到表中。 但是,我找不到合适的习惯来完成我的任务。
我有两张桌子。一个表是主表,另一个表是附加表。我需要在附加表中插入主要不存在的行,而忽略任何重复项。
我正在尝试使用以下的一些变体:
replace into primary
select * from additional;
但这显然取代了我不想要的行。我应该以某种方式使用on duplicate
还是我完全错误的方向?
编辑:
两个列都有一个唯一的代理键列,它只是一个整数值。
答案 0 :(得分:1)
如果您有唯一的密钥,则以下内容将在重复密钥上生成错误:
insert into primary(col1, . . .)
select col1, . . .
from secondary;
以下三种方法可以避免此错误。第一个是insert ignore
:
insert ignore into primary(col1, . . .)
select col1, . . .
from secondary;
insert ignore
的问题在于它忽略了所有错误。因此,除了重复的唯一键错误之外,您可能会错过重要的内容。
第二个是on duplicate key update
。你需要输入一个" no-op"更新声明:
insert into primary(col1, . . .)
select col1, . . .
from secondary
on duplicate key update col1 = col1;
这通常是最简单的方法。
第三个是join
或not exists
逻辑:
insert into primary(col1, . . .)
select col1, . . .
from secondary
where not exists (select 1 from primary where primary.keycol = secondary.keycol);
我认为如果两个查询同时插入行,则会导致竞争条件。
答案 1 :(得分:0)
你走向错误的方向。你想要这样的东西:
insert into primary
(field1, field2, etc)
select distinct field_a, field_b, etc
from additional
where whatever.
where子句是排除现有记录的地方。显然MySQL不支持except关键字,因此您必须使用其他方法。 This link会帮助您。
此外,如果primary具有自动生成的主键,请让数据库生成它。忽略其他的PK字段。