0

いくつかのデータベースがあり、それらの間でデータを交換する必要があります。データベース A のインポートからデータベース B にエクスポートすると、ID の競合が発生します。私は2つのアプローチを考えていますが、誰も私を満足させません。

  1. max(id) を選択し、競合を避けるために新しい ID を作成しますが、1 つの列に json 構造が格納され、ID も含まれています。(歴史的な理由)。したがって、新しい ID (主キー) を作成し、その json 列のすべての ID を変更する必要があります。

  2. または、データ インポートごとにバッチ情報を追加できます。データをインポートするとき、SQL のすべての ID を見つけて、それらの前にバッチ ID を追加します。そのような:

元のデータベースは次のようになります。

ID     COL_JSON
11     {id:11,name:xx ...} 

新しいレコードを挿入したい :11 、挿入後、id の前にバッチ情報「1000」を追加します

今dbは次のようになります

ID     COL_JSON
11     {id:11,name:xx ...}  
100011 {id:100011,name:xx ...}  

次のバッチは 1001,1002 1003 ... になるため、新しい 11 レコードを挿入する必要がある場合、データベースは次のようになります

ID     COL_JSON
11     {id:11,name:xx ...}  
100011 {id:100011,name:xx ...}  
100111 {id:100111,name:xx ...}  

2 つのアプローチは競合を解決できますが、2 つのアプローチはばかげていると感じます。優雅な計画はありますか?

4

3 に答える 3

1

レガシーシステムの場合、それに合わせる以外に良いアプローチはありません。レガシーシステムではこれ以上変更できないため、2番目のアプローチが良いようです。率直に言って、tt は愚かではなく、正しい方法です。

于 2013-03-13T11:15:48.130 に答える
0

あなたのデータベースが何を交換するのか正確にはわかりません。

両方のデータベースの両方のデータが必要な場合は、バッチに似たものを使用できますが、文字(A11およびB11 ID)を使用します。

これにより、データベースが大幅に大きくなった場合でも競合が発生しなくなります。

編集:2つのフィールドを持つ主キーを作成することもできます。自動インクリメントの整数IDと元のデータベース名のvarcharです。

于 2013-03-13T10:43:59.910 に答える
0

同期する必要があるテーブルがある場合(オンザフライではない)、次のアプローチを使用します。

  • 上書きされるメインテーブルには大きな自動増分があります(つまり、自動増分= 100000)
  • メインテーブルにマージされるセカンダリテーブルには、1から始まる通常の自動インクリメントがあります。

唯一の要件は、メインテーブルに十分な大きさの自動作成が設定されていることを確認することです。これにより、セカンダリテーブルIDがメインテーブルの最初のIDに到達することはありません。

于 2013-03-13T10:45:22.937 に答える