主キーとして 1 つの列 GUID (アルゴリズムのようなカスタム GUID) を持つマスター テーブルと、この GUID 列と外部キー関係を持つ 8 つの子テーブルを持つかなり巨大なデータベースがあります。すべてのテーブルには、約 300 万から 800 万のレコードがあります。これらのテーブルには、BLOB/CLOB/TEXT や、通常の数値、varchar、日付、およびタイムスタンプ (各テーブルに約 15 ~ 45 列) だけのその他の派手なデータ型はありません。主キーと外部キー以外のパーティションやその他のインデックスはありません。
現在、カスタム GUID アルゴリズムが変更されており、競合はありませんが、古いデータをすべて移行して、新しいアルゴリズムを使用して生成された GUID を使用したいと考えています。他の列を変更する必要はありません。最優先事項はデータの整合性であり、パフォーマンスは二の次です。
私が考えることができた可能な解決策のいくつかは次のとおりです(おそらく、それらはすべて1つのアイデアのみを中心に展開していることに気付くでしょう)
- 新しい列 ngu_id を追加し、新しい gu_id を入力します。制約を無効にします。ngu_id を gu_id として子テーブルを更新します。rename ngu_id->gu_id; 拘束を再度有効にする
- 子テーブルから 1 つのマスター レコードとそれに依存する子レコードを読み取ります。新しい gu_id で同じテーブルに挿入します。古い gu_ids を持つすべてのレコードを削除します
- 制約を削除します。すべての子テーブルが更新されるように、マスター テーブルにトリガーを追加します。古い gu_id を新しい新しい gu_id で更新し始めます。拘束を再度有効にする
- すべての子テーブルが更新されるように、マスター テーブルにトリガーを追加します。古い gu_id を新しい新しい gu_id で更新し始める
- すべてのマスター テーブルと子テーブルに新しい列 ngu_ids を作成します。ngu_id 列に外部キー制約を作成します。更新トリガーをマスター テーブルに追加して、値を子テーブルにカスケードします。新しい gu_id 値を ngu_id 列に挿入します。gu_id に基づく古い外部キー制約を削除します。gu_id 列を削除し、ngu_id を gu_id に名前変更します。必要に応じて制約を再作成します。
- 利用
on update cascade
可能な場合は使用しますか?
私の質問は次のとおりです。
- より良い方法はありますか?(頭を砂に埋められない、やらなきゃ)
- これを行う最も適切な方法は何ですか? (Oracle、SQL サーバー、および mysql4 でこれを行う必要があるため、ベンダー固有のハックは大歓迎です)
- このような演習の典型的な失敗点と、それらを最小限に抑える方法は何ですか?
あなたがこれまで私と一緒にいたら、ありがとう、そしてあなたが助けてくれることを願っています:)