如何合并两个 MySQL 表?

Posted

技术标签:

【中文标题】如何合并两个 MySQL 表?【英文标题】:How can I merge two MySQL tables? 【发布时间】:2010-10-18 01:19:03 【问题描述】:

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

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

【问题讨论】:

当您说 PK 可能会发生冲突时,您的意思是可能存在重复的行并且您不希望它们被复制,或者您需要为其中一个分配一个新的 PK,因为它们'虽然有相同的PK,但真的是不同的行吗? (使用自然主键的另一个原因) 【参考方案1】:

你也可以试试:

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 中的那些行,同时插入带有新主键的行。

【讨论】:

其实它会REPLACE现有的行(删除+插入),而不是更新。 如果表2有外键怎么办??????你将如何更新它?【参考方案2】:

这取决于主键的语义。如果它只是自动增量,那么使用类似的东西:

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

如果 PK 意味着什么,您需要找到一种方法来确定哪个记录应该具有优先权。您可以创建一个选择查询来首先查找重复项(请参阅answer by cpitis)。然后消除你不想保留的那些,并使用上面的插入来添加剩余的记录。

【讨论】:

【参考方案3】:
INSERT
INTO    first_table f
SELECT  *
FROM    second_table s
ON DUPLICATE KEY
UPDATE
        s.column1 = DO_WHAT_EVER_MUST_BE_DONE_ON_KEY_***(f.column1)

【讨论】:

感谢您的好主意。上面的 cmd 给了我一个语法错误。但这对我有用: INSERT INTO first_table SELECT * FROM second_table ON DUPLICATE KEY UPDATE second_table.column1 = DO_WHAT_EVER_MUST_BE_DONE_ON_KEY_***(first_table.column1) 就像@Tapper 一样,我无法为第一个表分配别名。我会得到Syntax error, unexpected IDENT_QUOTED - 无论如何都要通过 MySQL Workbench。 您能否举例说明您将在最后一行输入什么命令?我希望 ID 从表中现有的最高 ID 递增【参考方案4】:

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

首先,合并到一个临时表中,类似于:

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 查询中的括号,这导致了下面评论中的错误]

【讨论】:

当我尝试这个时,我收到了这个错误,“ERROR 1064 (42000): You have an error in your SQL syntax;检查与您的 MySQL 服务器版本相对应的手册以获取正确的语法以在附近使用'UNION select * from actor)' 在“行”,这是为什么呢?【参考方案5】:

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

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

【讨论】:

【参考方案6】:

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

【讨论】:

以上是关于如何合并两个 MySQL 表?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 mongify 将两个表合并为一个

mysql多表查询合并到一个临时表,怎么再加一列并把各自的表名加上?

如何合并两个 MySQL 结果?

如何将两个同样的MYSQL数据库表合并。表一表二的表结构是一样只是内容一个表多了些并且有部分字段修改过

如何将MYSQL数据库 2个同样的数据库合并在一起?

MySQL 查询;合并两个表