整数の主キーを持ついくつかの参照テーブルを使用します。ここで、intをGUIDに変更して、すべての参照をそのままにします。それを行う最も簡単な方法は何ですか?
ありがとうございました!
添加
私は一般的なプロセスを理解しているので、新しいGUID列に入力する方法など、より詳細なアドバイスが必要です。デフォルト値のnewid()を使用するのは正しいですが、既存の行はどうでしょうか。
整数の主キーを持ついくつかの参照テーブルを使用します。ここで、intをGUIDに変更して、すべての参照をそのままにします。それを行う最も簡単な方法は何ですか?
ありがとうございました!
添加
私は一般的なプロセスを理解しているので、新しいGUID列に入力する方法など、より詳細なアドバイスが必要です。デフォルト値のnewid()を使用するのは正しいですが、既存の行はどうでしょうか。
さらに、GUIDはint ID列のようにシーケンシャルではないため、データ/インデックスページにスペースを残します(fillfactor <100を指定)。つまり、挿入はデータ範囲内のどこにあってもかまいません。ページが100%いっぱいになると、ページ分割が発生します。
第一に:親愛なる神様なぜ?!?!?
次に、最初にすべてのテーブルにGUID列を追加してから、int値に基づいてテーブルにデータを入力する必要があります。完了したら、GUIDを主キー/外部キーに設定してからint列を削除できます。
値を更新するには、次のようにします
。
UPDATE foreignTable f
SET f.guidCol = p.guidCol
FROM primaryTable p
WHERE p.intCol = f.intCol
これは、分散コンピューティング モデルを実装するシステムに関係します。システムに情報を永続化するときにシステムが主キーを知る必要がある場合、ONEハンドラによって維持される自動インクリメント主キーを使用すると、システムの速度が低下します。代わりに、主キーを作成するための GUID ジェネレーターのようなメカニズムが必要です (主キーの真の特徴はその一意性にあることに注意してください)。そのため、複数のサービスでスケールアップし、それぞれが互いに独立して主キーを作成できます。
私は以前にこれを行う疑わしい特権を持っていました.基本的に私がしなければならなかったのは、いまいましいデータベース全体をXMLにエクスポートすることでした. 次に、java.util.Random の nextLong() 関数を使用して主キーを新しい GUID キーに置き換える Java アプリケーションを用意しました。その後、すべてをデータベースにインポートしました。
もちろん、XML ファイルを初めてインポートしようとしたときに、主キー フィールドの自動番号付け機能をオフにするのを忘れていたので、間違いから学んでください。もっと良い方法があると確信していますが、これは速くて汚い方法でした...そしてうまくいきました。ご参考までに、このプロジェクトはアプリケーションの規模を拡大することでした。
ええ、私はグレンと一緒です...私は彼がそれを投稿する前に実際に同じものを投稿することを躊躇していました....
GUIDとは別に自動インクリメントint主キーが必要ないのはなぜですか?はるかに柔軟性があり、GUID列にインデックスを付けるだけで、クエリのパフォーマンスが向上します...
柔軟性に関しては、他のユニークで主キーに値するアイテムが変更される可能性があるため、IDを自動インクリメントintとして保持するのが好きです。
柔軟性の良い例は、ユーザー名を主キーとして使用する場合です。それらがユニークであっても、それらを変更できるのは素晴らしいことです。ユーザーがユーザー名としてメールアドレスを使用した場合はどうなりますか?ユーザー名を変更して、すべてのクエリに影響を与えないようにすることは大きなプラスです。GUIDについても同じことが言えると思います。
手動でやらなきゃいけないと思います。または、そのためのユーティリティを作成することもできます。シナリオは次のようになります。
とても良い選択です。アプリケーションの 1 つで long から UUID に切り替えましたが、後悔していません。MS SQL Server を使用している場合、標準に含まれています (私は postgresql を使用しており、8.3 以降の標準にのみ含まれています)。
Glenn Slavenが述べたように、現在のレコードにあるキーから UUID を再作成できます。ただし、それらは一意ではないことに注意してください。ただし、そのようにして、関係をそのまま維持するのは簡単です。移動後に作成する新しいレコードは一意になります。
それをしないでください!GUID の使用を開始しましたが、今では PK としての INT への移行がほぼ完了しています。ログの目的で (および、「交渉可能なリレーショナル整合性」の一部のテーブルのために ;)) GUID を保持していますが、int を使用することによる速度の向上は驚異的です。
これは、テーブルの行数が数百万を超えたときに初めて明らかになりました。
私たちの最大の愚かさは、(シーケンシャル) ログ テーブルの PK として NEWID() を使用していたことです。