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


92

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

2つのテーブルの主キーが競合するので、それを考慮に入れます。


6
PKが競合する可能性があると言う場合、重複した行があり、それらをコピーしたくない、またはそれらの1つに新しいPKを割り当てる必要があるということですか?同じPK?(まだ自然な主キーを使用するもう1つの理由)
トムH

回答:


123

あなたも試すことができます:

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の対応する行で更新します。


2
実際には、更新ではなく、既存の行を置き換えます(削除+挿入)。
Cees Timmerman、2015

テーブル2に外部キーが使用されている場合はどうなりますか????? どのように更新しますか?
Kshitiz 2018

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
良いアイデアをありがとう。上記のコマンドを実行すると、構文エラーが発生します。しかし、これは私にとってはうまくいきます:INSERT INTO first_table SELECT * FROM second_table ON DUPLICATE KEY UPDATE second_table.column1 = DO_WHAT_EVER_MUST_BE_DONE_ON_KEY_CLASH(first_table.column1)
Tapper

@Tapperと同じように、最初のテーブルにエイリアスを割り当てることができませんでした。私はなるだろうSyntax error, unexpected IDENT_QUOTED-のMySQL Workbenchを経由とにかく。
blo0p3r 2014年

最後の行に入力するコマンドの例を教えてください。IDをテーブル内の最も高い既存のIDから増加させたい
Elliott B

15

手動で行う必要がある場合は、1回だけ:

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

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;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.