同じ構造の2つのMySQLテーブルをマージするにはどうすればよいですか?
2つのテーブルの主キーが競合するので、それを考慮に入れます。
同じ構造の2つのMySQLテーブルをマージするにはどうすればよいですか?
2つのテーブルの主キーが競合するので、それを考慮に入れます。
回答:
あなたも試すことができます:
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の対応する行で更新します。
それは主キーの意味論に依存します。自動インクリメントだけの場合は、次のようなものを使用します。
insert into table1 (all columns except pk)
select all_columns_except_pk
from table2;
PKが何かを意味する場合、どのレコードを優先するかを決定する方法を見つける必要があります。最初に重複を見つける選択クエリを作成できます(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を経由とにかく。
手動で行う必要がある場合は、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クエリの括弧を削除しました。これにより、以下のコメントでエラーが発生しました]
それほど複雑ではありません....重複する主キーをクエリから除外してください....これは私にとってはうまくいきます!
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;