【问题标题】:Insert rows if they don't exist into a table from another table如果行不存在,则将行从另一个表插入到表中
【发布时间】:2014-04-22 22:20:39
【问题描述】:

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

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

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

replace into primary 
select * from additional;

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

编辑:

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

【问题讨论】:

    标签: mysql sql


    【解决方案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。您需要输入“无操作”更新语句:

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

    如果两个查询同时插入行,我认为这可能会导致竞争条件。

    【讨论】:

    • 谢谢,我认为第二种方法最适合我的目的。看起来不错,效果很好。
    【解决方案2】:

    你走错了方向。你想要这样的东西:

    insert into primary
    (field1, field2, etc)
    select distinct field_a, field_b, etc
    from additional
    where whatever.
    

    where 子句是排除现有记录的地方。显然 MySQL 不支持 except 关键字,所以你必须使用其他方法。 This link 将帮助您。

    另外,如果 primary 有一个自动生成的主键,让数据库生成它。忽略附加的PK字段。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-11
      • 1970-01-01
      • 2018-12-17
      • 2012-09-17
      • 2016-08-07
      • 1970-01-01
      • 2021-04-25
      • 1970-01-01
      相关资源
      最近更新 更多