如何合并两个MySQL表?


92

如何合并结构相同的两个MySQL表?

这两个表的主键将发生冲突,因此我已将其考虑在内。


6
当您说PK可能冲突时,您的意思是可能存在重复的行并且您不希望它们被复制,或者您需要为其中一个分配新的PK,因为尽管它们具有相同的行,但它们实际上是不同的行同样的PK?(但是使用自然主键的另一个原因)
Tom H

Answers:


123

您也可以尝试:

INSERT IGNORE
  INTO table_1 
SELECT *
  FROM table_2
     ;

这允许table_1中的那些行取代table_2中具有匹配的主键的那些行,同时仍然插入具有新主键的行。

或者,

REPLACE
   INTO table_1
 SELECT *
   FROM table_2
      ;

将使用来自表_2的对应行更新表_1中已经存在的行,同时插入具有新主键的行。


2
实际上,它将替换现有行(删除+插入),而不更新。
Cees Timmerman

如果表2使用了任何外键怎么办?您将如何更新呢?
Kshitiz

39

它取决于主键的语义。如果只是自动增量,请使用类似以下内容的方法:

insert into table1 (all columns except pk)
select all_columns_except_pk 
from table2;

如果PK有意义,则需要找到一种方法来确定哪个记录应具有优先权。您可以创建一个选择查询来首先查找重复项(请参阅cpitis的答案)。然后消除那些您不想保留的记录,并使用上述插入内容添加保留的记录。


21
INSERT
INTO    first_table f
SELECT  *
FROM    second_table s
ON DUPLICATE KEY
UPDATE
        s.column1 = DO_WHAT_EVER_MUST_BE_DONE_ON_KEY_CLASH(f.column1)

1
谢谢你的好主意。上面的cmd给了我语法错误。但是,这对我的作品:INSERT INTO first_table SELECT * FROM second_table对重复密钥更新second_table.column1 = DO_WHAT_EVER_MUST_BE_DONE_ON_KEY_CLASH(first_table.column1)
塔珀

就像@Tapper一样,我无法为第一个表分配别名。Syntax error, unexpected IDENT_QUOTED无论如何,我都会通过MySQL Workbench 获得的。
blo0p3r 2014年

您能否提供在最后一行输入什么命令的示例?我希望ID从表格中现有的最高ID递增
Elliott B

15

如果需要手动执行,请一次:

首先,在临时表中合并以下内容:

create table MERGED as select * from table 1 UNION select * from table 2

然后,使用类似以下内容识别主键约束

SELECT COUNT(*), PK from MERGED GROUP BY PK HAVING COUNT(*) > 1

其中PK是主键字段...

解决重复项。

重命名表。

[已编辑-删除了UNION查询中的方括号,这在下面的注释中引起了错误]


当我尝试此操作时,收到以下错误消息:“错误1064(42000):您的SQL语法有错误;请查看与您的MySQL服务器版本相对应的手册,以获取正确的语法以在'UNION select * from actor)附近使用'在“”行,为什么?
jcho360

7

听起来并不复杂...。只需将重复的主键放在查询之外....这对我有用!

INSERT INTO
  Content(
    `status`,
    content_category,
    content_type,
    content_id,
    user_id,
    title,
    description,
    content_file,
    content_url,
    tags,
    create_date,
    edit_date,
    runs
  )
SELECT `status`,
  content_category,
  content_type,
  content_id,
  user_id,
  title,
  description,
  content_file,
  content_url,
  tags,
  create_date,
  edit_date,
  runs
FROM
  Content_Images

0

你可以写一个脚本来更新FK对你..看看这个博客:http://multunus.com/2011/03/how-to-easily-merge-two-identical-mysql-databases/

他们有一个聪明的脚本,可以使用information_schema表获取“ id”列:

SET @db:='id_new'; 

select @max_id:=max(AUTO_INCREMENT) from information_schema.tables;

select concat('update ',table_name,' set ', column_name,' = ',column_name,'+',@max_id,' ; ') from information_schema.columns where table_schema=@db and column_name like '%id' into outfile 'update_ids.sql';

use id_new
source update_ids.sql;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.