両方の顧客があなたのアプリケーションを使用しているとのことですが、この 2 つだけでなく、より多くの顧客に使用されているある種の「シュリンクラップ」ソフトウェアであると思いますよね?
はいの場合、テーブルに特別な列を追加したり、このようなものを追加したりすると、将来的に問題が発生する可能性があります。追加の列を処理できるこれら 2 つの顧客用の特別なバージョンを維持する必要があるからです。または、これらの列をメインのコードベースに導入する必要があります。つまり、他のすべての顧客も列を取得することになります。
テーブルを変更したり列を追加したりせずに、これを行う簡単な方法を考えてみます。
これを機能させるには、両方のデータベースに同時に存在する最大の ID を見つける必要があります (どのテーブルまたはどのデータベースにあるかは関係ありません) .
次のような多くのクエリを取得するには、コピーと貼り付けが必要になる場合があります:
select max(id) as maxlocationid from locations
select max(id) as maxpersonid from persons
-- and so on... (one query for each table)
両方のデータベースでクエリを実行して最大の ID を見つけたら、その ID よりも大きい数値を取得し、それを 2 番目のデータベースのすべてのテーブルのすべての ID に追加します。
その数値が非常に重要です。両方のデータベースに既に存在する最大の ID よりも大きくする必要があります!
説明するのは少し難しいので、ここに例を示します:
両方のデータベースの任意のテーブルの最大 ID が 8000
であるとします。 .
次に、10000
を追加する SQL を実行します。 2 番目のデータベースのすべてのテーブルのすべての ID :
update Locations set Id = Id + 10000
update Persons set Id = Id + 10000, LocationId = LocationId + 10000
-- and so on, for each table
クエリは比較的単純ですが、すべての ID 列の正しい名前を使用して、データベース内のテーブルごとにこのようなクエリを手動で作成する必要があるため、これが最も手間がかかります。
2 番目のデータベースでクエリを実行すると、質問のサンプル データは次のようになります。
データベース 1: (以前とまったく同じ)
Locations
:
Id Name Adress etc....
1 Location 1
2 Location 2
Persons
:
Id LocationId Name etc...
1 1 Alex
2 1 Peter
3 2 Lisa
データベース 2:
Locations
:
Id Name Adress etc....
10001 Location A
10002 Location B
Persons
:
Id LocationId Name etc...
10001 10001 Mark
10002 10002 Ashley
10003 10001 Ben
以上です!これで、主キー違反をまったく発生させることなく、あるデータベースから別のデータベースにデータをインポートできます。