わかりました、私はしばらくこの問題に取り組んできました。いくつかの回避策を見つけましたが、私が考えた方法でそれを行うことが可能かどうか知りたいです.
私は 2 つのデータベースを持っています。1 つはデータを収集する Web サーバー上のリモート (私はそれと呼びますDB_A
)、もう 1 つはこのデータを分析するローカル マシン上 (私はそれと呼びますDB_B
) です。テーブルは基本的に同じ構造ですが、処理側 ( DB_B
) を追加しましたいくつかの列。
したがって、サーバー側 ( DB_A
) は次のようになります。
|UserID|LastActive|InfoA|InfoB|
ローカル側 ( DB_B
) では次のようになります。
|UserID|LastActive|InfoA|InfoB|InfoC|
したがって、最初にデータをローカル側にインポートすると、データをInfoC
処理NULL
してInfoC
. その間、DB_A
は新しいデータで満たされ、更新されます。私が望むのは、データをエクスポートして、上書きせずにフィールドを更新してDB_A
インポートすることです。これにより、まだ設定されていないすべての行を後で処理できますDB_B
LastActive
InfoB
InfoC
InfoC
私がこれまでに見つけたもの:
- テーブルの構造が異なるため、単純な mysqldump とインポートは機能しません。したがって、mysql を --execute および -X パラメータとともに使用して、XML データファイルを取得します。
- で XML ファイルをインポートし
DB_B
てもエラーは発生しませんLOAD XML INFILE 'path/to/file.xml' REPLACE INTO TABLE users;
。InfoC
- 代わりにステートメントを使用する
INSERT IGNORE
と、すでにインポートされているユーザーは明らかに更新されません。
だから私の質問は: 中間テーブルのような回避策を使用せずに MySQL でこれを行う方法はありますか?
追加:これはPHPまたは他の言語を使用して簡単に実行できることを知っていますが、できれば単純なMySQLソリューションに固執したいと思います
編集: Simon のおかげで、tmp データベースを使用するかなり単純なソリューションが得られました。これにより、mysqldump を使用することもでき、遅い XML 方式を使用する必要がなくなります。
# create temporary db (for tweaking performance create it in memory)
DROP TABLE IF EXISTS tmp_users;
CREATE TABLE tmp_users LIKE users;
# import data (just as an example, this is not mysql syntax)
mysql<users.sql
# this is even simpler than in the answer
# since you don't have to specify values for the select and insert
INSERT INTO users
SELECT * FROM tmp_users
ON DUPLICATE KEY UPDATE
LastActive = VALUES(LastActive),
InfoA = VALUES(InfoA),
InfoB = VALUES(InfoB);
DROP TABLE IF EXISTS tmp_users;