おかげで、我々はあなたがテーブルの構造を知っていると仮定します。言い換えれば、「これらの列、索引および制約のすべてがどのようなものであるかをどのように見つけ出すか」という質問はしていません。
第二に、我々はB.
へ
からコピーしている間に、あなたの「他のソースは、」ワイルドカードである制約を強制する必要はありませんので、テーブルAのすべてのデータが有効であることを前提とする傾向があります。私はあなたがこの他のソースに有効なデータが含まれている場合は知らない、と示唆していると仮定しています:
1)Bを作成し、W/O indecesまたは制約
2)「その他のソース」からのコピー/一括挿入するにB
3)無効な行を見つけるためにSELECTSを発行して制約を実行します。データが有効であることがわかっている場合は、この手順をスキップしてください。進んでいい場合は、
4)「チャンク」でAをBにコピーします。ここで問題となるのは、すべてのX個の何百万行もの行のSELECT ... INTO ...は、1回の暗黙のトランザクションでそれを行うために必要なリソースが爆発的に増加するためです。永遠に取る(なぜなら、一度に1つの行を行うのはちょっと普通だからです)。したがって、一度に1000または10000行のチャンクを処理します。
5)すべてのデータがコピーされ、indeces
6を追加)が制約
7を追加)
8ドロップ) `CREATE TABLEをB
の名前を変更... LIKE oldtableはここで便利になるかもしれませんが、インデックス定義をコピーします。 –
ありがとうMarc、LIKEを使用している可能性があります。私のためらっているのは、LIKE ..ステートメントに関する以下の説明のためです。 CREATE TABLE ... LIKEは、元のテーブルまたは外部キー定義に指定されたDATA DIRECTORYまたはINDEX DIRECTORYテーブルオプションを保持しません。現在、私はテーブルに外部キーを持っていないので、おそらくこれで行くでしょう。 @ケン、元のテーブルの内容を新しいデータで同時に処理する必要があるので、あなたが提案した通りにはできません。 – Mahesh