web-dev-qa-db-ja.com

コマンドラインを使用して2つのMySqlテーブルを同期する方法

同じデータベース(MySql)に2つのテーブルがあり、1つにデータが入力されており、そこにデータが頻繁に追加されています。

最初のテーブルに追加されたデータを、コンソールでMySqlコマンドを使用して他の(同期された)に存在させたい(トリガー、イベントなどの他のメソッドなしで)

これは可能ですか?可能な場合、コマンドは何ですか?

3
Buntu Linux

重複を根絶するために両方のテーブルに主キーまたは一意のキーを実装している場合、これはmysql replace into機能を使用して実現できます。 replace intoは、insert intoと同様の構文を持ちます。テーブルにキーが存在する場合、最初に古い行を削除し、次の行を挿入します。

mysql> replace into table2 select * from table1

Cronジョブを使用するか、mysqlイベントスケジューラを使用して、必要なタイミングに従って他のテーブルにデータを入力できます。

それが役に立てば幸い

1
Nawaz Sohail

これらの条件に該当する場合:

  • pKがあり、最後に挿入された行は常に最高のIDを持っています。
  • 行はソーステーブルに挿入され、変更または削除されることはありません。

...その後、シンプルなINSERT INTO。何かのようなもの :

INSERT INTO destTable SELECT * FROM srcTable 
WHERE id > (SELECT COALESCE(MAX(id),0) FROM destTable)

これは、INSERTからのすべての新しい行をdestTable(同期テーブル)にsrcTableします。

あなたが使用できるコンソールからそれを実行するには

mysql -h hostname -u username -p db_name -e "INSERT INTO destTable SELECT * FROM srcTable WHERE id > (SELECT COALESCE(MAX(id),0) FROM destTable);" 
1
ForguesR

データウェアハウスアプリケーションがあり、「レポート」が問題を引き起こしているようです。 「テーブルロック」を実行するMyISAMを使用しているようです-これがおそらくレポート中に「スタック」する原因です。

データのコピー全体を含むステージングテーブルの代わりに、単に処理されるのを待っている「新しい」レコードを用意します。

「生の」(「ファクト」)テーブル全体から直接レポートを実行する代わりに、サマリーテーブルからレポートを実行します。これは、(1)はるかに高速(多くの場合、レポートでは10倍高速)であり、(2)「スタック」を回避します。

ステージングテーブルから要約を行うことをお勧めします。これにより、データを書き込む場合を除いて、ファクトテーブルは実質的に変更されません。その場合、Factテーブルに多くのインデックスは必要ありませんし、持つべきではありません。 (インデックスは取り込みを遅くします。)

これらのタスクを達成する方法の詳細については、

DWアプリケーションはかなり異なる傾向があるため、アプリについてさらに詳しく説明する必要がある場合があります。それから私は私のアドバイスでより具体的にすることができます。

1
Rick James