5

2人の顧客が合併します。彼らは両方とも、独自のデータベースで私のアプリケーションを使用しています。約数週間で合併します(1つの組織になります)。したがって、すべてのデータを1つのデータベースに入れたいと考えています。

したがって、2つのデータベース構造は同一です。問題はデータにあります。たとえば、私はテーブルの場所と人を持っています(これらは50の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....
1     Location A
2     Location B

Persons

Id    LocationId     Name     etc...
1     1              Mark
2     2              Ashley
3     1              Ben

人が場所に関連していることがわかります(列locationId)。locationテーブルとpersonsテーブルを参照しているテーブルが他にもあることに注意してください。

データベースには独自の場所と人物が含まれていますが、IDは同じでもかまいません。場合によっては、すべてをDB2にインポートする場合、DB1の場所をID3および4でDB2に挿入する必要があります。DB1の人物は新しいID4、5、6を持ち、人物テーブルの場所も必要です。 ID4、5、6に変更する必要があります。

この問題の私の解決策は、すべてを処理するクエリを作成することですが、どこから始めればよいのかわかりません。

子へのカスケードもあるIdフィールドに番号を付け直す(クエリで)最良の方法は何ですか?データベースには、参照整合性と外部キーが含まれていません(外部キーはデータベースで定義されていません)。FKeyとカスケードの作成はオプションではありません。

SQLServer2005を使用しています。

4

2 に答える 2

2

両方の顧客があなたのアプリケーションを使用しているとあなたは言うので、それはこれら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次に、 2番目のデータベースのすべてのテーブルのすべてのIDに
追加するSQLを実行します。10000

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

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

于 2013-02-23T17:37:27.273 に答える
0

これが私の問題である場合、私はおそらく、保持しようとしていたデータベースのテーブルにいくつかの列を追加するでしょう。これらは、他のデータベースからのpk値を格納するために使用されます。次に、他のテーブルからレコードを挿入します。外部キーを持つものについては、既知の値を使用します。次に、必要に応じて更新し、追加した列を削除します。

于 2013-02-23T15:18:47.210 に答える