【发布时间】:2010-10-18 01:19:03
【问题描述】:
如何合并两个结构相同的 MySQL 表?
两个表的主键会冲突,所以我已经考虑到了。
【问题讨论】:
-
当您说 PK 可能会发生冲突时,您的意思是可能存在重复的行并且您不希望它们被复制,或者您需要为其中一个分配一个新的 PK,因为它们'虽然有相同的PK,但真的是不同的行吗? (使用自然主键的另一个原因)
如何合并两个结构相同的 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 意味着什么,您需要找到一种方法来确定哪个记录应该具有优先权。您可以创建一个选择查询来首先查找重复项(请参阅answer by cpitis)。然后消除你不想保留的那些,并使用上面的插入来添加剩余的记录。
【讨论】:
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)
【讨论】:
Syntax error, unexpected IDENT_QUOTED - 无论如何都要通过 MySQL Workbench。
如果您需要手动执行一次:
首先,合并到一个临时表中,类似于:
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;
【讨论】: