sql >> データベース >  >> RDS >> Sqlserver

2 つの同一のデータベース データを 1 つにマージする方法は?

    両方の顧客があなたのアプリケーションを使用しているとのことですが、この 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
    

    以上です!これで、主キー違反をまったく発生させることなく、あるデータベースから別のデータベースにデータをインポートできます。



    1. puppetを介してmysqlをインストールします

    2. EDBがPostgres市場のリーダーになった経緯

    3. 再帰的なPLSQLクエリのヘルプ

    4. n-depthツリーの値をチェックしていますか?