テーブルに間違ったエントリを持つ 2 つの列があります。テーブルのサイズは、数十億のレコードに達します。2 つの列 (c1 と C2) の間でデータを交換したかったのですが、データを小さなチャンクで CSV ファイルにエクスポートし、修正されたエントリでインポートし直すというアプローチが取られました。たとえば、以下はデータセットです
--------
|C1 | C2 |
|3 | 4 |
|4 | 6 |
次に、データをセミコロンで区切られた CSV ファイルにエクスポートします (完全なコマンドは示されていません)。
SELECT C2,C1 FROM TABLE temp INTO OUTFILE /tmp/test.csv
そのようなコマンドの出力は次のようになります
4;3
6;4
(問題のデータを削除した後) データをインポートし直すと、データは次のように修正されます。
| C1 C2 |
| 3 4 |
| 4 6 |
それは本当に OUTFILE と INFILE 操作の問題だと思います
質問
- アプローチは理にかなっていますか?実際のデータは、データ スワップとは別に、一部の列で NULL、int 値も想定しています。
- もう 1 つの複雑さは運用データベースにあり、WHERE句を使用する必要があります。テーブル名も動的に取得されます。
- ポイント 2 を参照して、クエリに動的性を追加するにはどうすればよいですか。STORED プロシージャまたは SHELL SCRIPT を使用する必要がありますか? STORED プロシージャは、LOAD DATA INFILE 機能をサポートしていないようです。
- シェルが残っている場合、再利用できるサンプル スクリプトはありますか? CSV ファイル名、テーブル名、および WHERE 句は実行時に作成する必要があります。
- また、エクスポートおよびインポートされるチャンクのサイズは動的に計算されます。
- 他のアプローチはありますか?
注 - これは mysql 上の INFOBRIGHT 列ベースのテーブルです。UPDATE クエリはパフォーマンスが低く、ALTER TABLE は INFOBRIGHT でサポートされていません。