SQL:仅根据主键列将丢失的行从一个表复制到另一个表

时间:2019-05-25 13:18:37

标签: php mysql sql

我试图将丢失的行从一个表复制到另一个表,但前提是主键字段不存在。两个表都具有相同的列名,但我没有列数及其名称,也没有主键列名,因此它可以是“ ID”或其他任何名称。让我用一个例子来解释:

表1:

   column 1 (primary key) , Column 2 , Column 3 , ...
   1 , England , London , ...
   2 , France , Paris , ...
   3, Italy , Rome , ...
   4 , Germany , Berlin , ...

表2:

    column 1 (primary key) , Column 2 , Column 3 , ...
    1 , Whatever , Whatever , ...
    2 , Whatever , Whatever , ...

我想将第3行和第4行复制到表2中,这样结果将是:

表2:

    column 1 (primary key) , Column 2 , Column 3 , ...
    1 , Whatever , Whatever , ...
    2 , Whatever , Whatever , ...
    3 , Italy , Rome , ...
    4 , Germany , Berlin , ...

我尝试过

   REPLACE INTO table1 SELECT * FROM table2; 

但这将替换整个表,即表2变得与表1完全相同

2 个答案:

答案 0 :(得分:0)

您可以使用insert . . . select

insert into table2 ( col1, col2 . . . )
    select t1.col1, t1.col2, t1.col3, . . .
    from table1 t1
    where not exists (select 1 from table2 t2 where t2.id = t1.id)

答案 1 :(得分:0)

如果您只想忽略table1中具有主键的table2中的行,那么最简单的方法是使用INSERT IGNORE语法:

INSERT IGNORE INTO table2 SELECT * FROM table1;

请注意,如果任何UNIQUE KEY(不仅是PRIMARY)中有重复项,则将忽略该行并将其插入。

文档:INSERT Syntax

  

如果使用IGNORE修饰符,则在执行   INSERT语句将被忽略。例如,在没有IGNORE的情况下,   复制表中现有的UNIQUE索引或PRIMARY KEY值   导致重复键错误,并且语句中止。用   IGNORE,该行将被丢弃,并且不会发生错误。忽略的错误   而是生成警告。

还请注意,两个表中的列应以相同的顺序定义。实际上,这些表应该具有完全相同的架构(具有相同数据类型,长度,字符集和排序规则的相同列)。