web-dev-qa-db-ja.com

2つのMySQLテーブルをマージするにはどうすればよいですか?

同じ構造を持つ2つのMySQLテーブルをマージするにはどうすればよいですか?

2つのテーブルの主キーが衝突するため、それを考慮に入れています。

90
Steve McLeod

また試すことができます:

INSERT IGNORE
  INTO table_1 
SELECT *
  FROM table_2
     ;

これにより、table_1の行は、一致する主キーを持つtable_2の行に取って代わり、新しい主キーを持つ行を挿入できます。

あるいは、

REPLACE
   INTO table_1
 SELECT *
   FROM table_2
      ;

新しい主キーを持つ行を挿入しながら、table_1にあるそれらの行をtable_2の対応する行で更新します。

120
fcw

主キーのセマンティクスに依存します。単なる自動インクリメントの場合は、次のようなものを使用します。

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

PKが何かを意味する場合、どのレコードを優先するかを決定する方法を見つける必要があります。最初に重複を見つけるための選択クエリを作成できます( answer by cpitis を参照)。次に、保持しないレコードを削除し、上記の挿入を使用して、残っているレコードを追加します。

38
Milan Babuškov
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)
21
Quassnoi

手動で行う必要がある場合は、一度:

まず、次のような一時テーブルにマージします。

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クエリの角かっこを削除]

15

見た目ほど複雑ではありません。..クエリから重複する主キーを除外するだけです。

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
7
Bill Warren

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;
0
TimoSolo