我怎样才能合并两个MySQL表?

我怎样才能合并两个具有相同结构的MySQL表?

两个表的主键会发生冲突,所以我已经考虑到了这一点。

你也可以尝试:

INSERT IGNORE INTO table_1 SELECT * FROM table_2 ; 

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

或者,

 REPLACE INTO table_1 SELECT * FROM table_2 ; 

将使用table_2中的相应行更新table_1中已有的行,同时用新的主键插入行。

这取决于主键的语义。 如果它只是自动增量,则使用如下所示:

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

如果PK意味着什么,你需要find一种方法来确定哪个logging应该有优先权。 您可以创build一个select查询来首先查找重复项(请参阅cpitis的答案 )。 然后消除那些你不想保留的,并使用上面的插入来添加logging。

 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) 

如果您需要手动执行一次:

首先,在临时表中合并,如下所示:

 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查询中编辑 – 删除的括号,导致下面注释中的错误]

不像它听起来那么复杂….只需将重复的主键从您的查询中删除….这对我有用!

 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 

你可以写一个脚本来更新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;