1

2 台の異なるマシンで同じデータベースを実行しています。DB は Identity 列を広範囲に使用しており、テーブルはかなりひどく衝突しています。根本的な問題を整理する前に、これら2つをマージしたいと思います。

A) GUID の使用 (扱いにくいが、どこでも機能する) B) ID 範囲の割り当て、一種のナフですが、レコードに順番にアクセスし、基本的な Sql を呼び出してレコードを簡単に選択し、どのマシンがデータを生成したかを識別できることを意味します。

私の質問は、データが衝突しないように、データベースの 1 つでキーを再設定する (つまり、主キーを変更する) 最善の方法は何かということです。全部で 6 つのテーブルしか見ていませんが、3 つのテーブルには 2M までの行がたくさんあります。

更新-これを行う実際のSQLコードはありますか、Identity Insertなどについて知っています。以前にいくつかのエレガントな方法でこの問題を解決しましたが、エレガントなソリューションを探していました。ロバ作業を行うための TSQL SP - それが存在しない場合は、コードを作成して wiki に掲載します。

4

2 に答える 2

0

単純な方法は、データベースの 1 つのすべてのキーを一定の増分 (たとえば 10,000,000) で変更することです。これを行うには、アプリケーションを停止してデータベースを静かにし、これによって影響を受けるすべての FK 参照を削除し、終了時にそれらを再作成する必要があります。また、影響を受けるすべての ID 列のシード値を適切な値にリセットする必要があります。

一部のテーブルは参照データになり、同期されていないとマージがより複雑になります。異なるインスタンスで同じことを意味する競合するコード、または異なる意味を持つ同じコードで問題が発生する可能性があります。これはアプリケーションの問題である場合とそうでない場合がありますが、インスタンス間でこれを調整せずにインスタンスが実行された場合は、これを注意深く確認する必要があります。

また、名前や住所などのデータは、正規のソースがなければ同期されない可能性が非常に高くなります。これらを取得し、一致するクエリを実行し、ビジネスに例外を整理する必要がある場合があります。

于 2009-01-21T10:31:01.873 に答える
0

最初にテーブルに別の列を追加し、新しいPrimary key.

次に、update ステートメントを使用foreign keyして、関連するすべてのテーブルの新しいフィールドを更新します。

Primary key次に、古いフィールドと古いフィールドを削除できforeign keyます。

于 2015-01-21T06:37:25.027 に答える