2011-10-30 13 views
0

私は2つのデータベースを結合したいと思っています。どちらも同じスキーマを持ちます。 2番目のデータベースは最初のデータベースと同じデータで開始しましたが、特定の日付に分岐しました。矛盾するIDを持つSQLデータベースを結合する

問題は、一部のテーブルのIDが同じポイントから自動インクリメントし続けているため、両方のテーブルが異なるデータに対して同じIDを使用することです。 IDは他のテーブルの外部キーとして使用されることにも言及する必要があります。

私は、2番目のデータベースのすべてのIDに値を追加するだけで、競合を削除できると考えていました。これはこれを行うための許容可能な方法ですか?もしそうなら、それを行う最良の方法は何か。もしそうでなければ、何が良い方法でしょう。

+0

最初のIDを変更しないでください – regilero

答えて

3

あなたは

  1. データベースがオフラインになっていると、あなたが任意のプライマリまたは外部キーフィールドをお見逃しなく変更
  2. を受け付けないことに注意しながら、すべてのテーブルのプライマリキーと外部キーの値にオフセットを追加することができます
  3. あなたは明らかにどこでも同じオフセットを追加します。

例は、ステートメントを更新します。

UPDATE parent_tbl SET primary_key_col = primary_key_col + 5000; 
UPDATE child_tbl SET foreign_key_col = foreign_key_col + 5000; 
... 
... 
UPDATE parent_tbl_99 SET primary_key_col = primary_key_col + 5000; 
UPDATE child_tbl SET_99 foreign_key_col = foreign_key_col + 5000; 

これはON UPDATE CASCADEオプションを使用して外部キーを作成することは非常に参考にされているだろうインスタンスです。主キー列を変更するだけで済み、変更は外部キーとして参照する表に反映されます。

1

また、結合する前にいずれかのデータベースのすべてのIDを二重にしてください。これの利点はかなり明らかです。どこでも(外部キーを含む)それをやる必要があります。そして、いくつかのIDが奇妙なので、通常は省略されたテーブルを伝えることができます。

これは、より多くのデータベースを組み合わせるために一般化することができます。たとえば、3つのデータベースの場合、3の倍数が必要です.1つは、+1でオフセットされた倍数でなければならず、最後のものは+2でオフセットされます。