85


40

同じ構造を持つ2つのMySQLテーブルをマージする方法を教えてください。

2つのテーブルの主キーが衝突するので、私はそれを考慮に入れました。

6 Answer


115


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

INSERT IGNORE INTO table_1 SELECT * FROM table_2;

これにより、table_1内の行とtable_2内の一致する主キーを持つ行を置き換えることができますが、それでも新しい主キーを持つ行を挿入できます。

あるいは

table_1 SELECT * FROM table_2にINPLACEします。

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


37


それは主キーの意味によって異なります。 それが単なるオートインクリメントであるならば、それから何かを使う:

table1に挿入(pk以外のすべての列)table2からall_columns_except_pkを選択します。

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


21


最初のテーブルへのINSERT f SELECT *二重キーの更新への二番目のテーブルからs.column1 = DO_WHAT_EVER_MUST_BE_DONE_ON_KEY_CLASH(f.column1)


15


手動で実行する必要がある場合は、一度、

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

テーブル1からのselect *としてMERGEDテーブルを作成する

次に、次のようにして主キー制約を識別します。

SELECT COUNT(*)、PKを持つPKによるマージグループからのPK(*)> 1

PKが主キーフィールドの場合

重複を解決してください。

テーブルの名前を変更します。

[編集済み - UNIONクエリの角かっこを削除したため、以下のコメントでエラーが発生していました]


6


それは聞こえるほど複雑ではありません…​. 重複した主キーをクエリから除外してください。 これは私のために働きます!

INSERT INTOコンテンツ( `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は、Content_Imagesから実行されます。


0


あなたはあなたのためにFKを更新するスクリプトを書くことができます。 このブログをチェックしてください:http://multunus.com/2011/03/how-to-easily-merge-two-identical-mysql-databases/

それらは "id"カラムを得るためにinformation_schemaテーブルを使う賢いスクリプトを持っています:

SET @db:= 'id_new';

information_schema.tablesから@max_id:= max(AUTO_INCREMENT)を選択します。

information_schema.columnsからconcat( 'update'、table_name、 'set'、column_name、 '='、column_name、 ''、@ max_id、 ';')を選択します。 update_ids.sql ';

id_new source update_ids.sqlを使用してください。