如果行不存在于另一个表的表中,则插入行

时间:2014-04-22 22:20:39

标签: mysql sql

我知道如何使用insert into将一行值插入到表中。 但是,我找不到合适的习惯来完成我的任务。

我有两张桌子。一个表是主表,另一个表是附加表。我需要在附加表中插入主要不存在的行,而忽略任何重复项。

我正在尝试使用以下的一些变体:

replace into primary 
select * from additional;

但这显然取代了我不想要的行。我应该以某种方式使用on duplicate还是我完全错误的方向?

编辑:

两个列都有一个唯一的代理键列,它只是一个整数值。

2 个答案:

答案 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;

这通常是最简单的方法。

第三个是joinnot 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字段。