11

両方のデータベースのスキーマは同じですが、一部のテーブルで主キーとの競合が発生する可能性があります。したがって、重複する行を無視して、さらにマージを続けてほしいと思います。

4

6 に答える 6

10

まず、キーの競合は、現在使用しているプロセスが不十分であることを示しています。

自動生成された(非GUID)キーを使用している2つのデータベースを正しくマージするには、いくつかの手順を実行する必要があります。最初に新しい自動生成キーを親テーブルに追加し、次に両方のテーブルからすべてのデータをインポートし、古い古いファイルの名前をID_oldに変更し、新しいファイルの名前を古いID名に変更します。この時点で、子テーブルに移動できます。親テーブルに結合し、既存のテーブルの値ではなく、新しいidフィールドを外部キーの値として使用して、子テーブルにコピーする必要があります。すべての外部キーテーブルに対してこのプロセスを繰り返す必要があります。そのテーブルが親テーブルでもある場合は、データをコピーする前に、conversionidフィールドをテーブルに追加する必要があります。これにより、チェーン全体で作業できるようになります。 。これを適切に行うには、データベースの構造に関する多くの知識と多くの計画が必要です。両方のソースデータベースの適切なバックアップなしでこれを行うことを検討しないでください。また、両方のデータベースがシングルユーザーモードのときにプロセスが発生する可能性がある場合にも最適です。

自然キーを使用していて重複している場合は、まったく別の問題が発生します。重複するすべてのキーレコードは、最初に別のテーブルに移動され、どちらがより正確なデータであるかを判断する必要があります。場合によっては、自然キーが実際には一意ではなく(ほとんど使用しないのはそのためです)、マージされたデータベースは、ある種の自動生成されたキーで動作する必要があります。これには、データベースの変更だけでなくコードの変更も含まれるため、最後の手段のオプションです。

自然キーでよく見られるのは、それぞれのデータは異なりますが、類似していることです(アドレスのSt. vice Street)。この場合、レコードの1つに挿入のマークを付け、2つのステップで挿入を行う場合は、最初にレコードを作成します。重複がない場合は、挿入のマークが付けられた重複テーブルのレコード。保持するレコードと保持しないレコードを決定するには、すべての外部キーテーブルのすべてのレコードを調べる必要があることを忘れないでください。重複を破棄することは悪い考えであり、その方法でデータ、場合によっては重要なデータ(顧客の注文など)が失われます。これは長く退屈なプロセスであり、データの専門知識を持った人が決定を下す必要があります。プログラマーとして、重複排除ツールを提供して、重複の各セットのすべてのデータを調べ、何を保持し、何を削除するかを選択し、すべてにマークを付けると、レコードを挿入するプロセスが実行されます。設計で覚えておいてください。真の複製の場合、入力するレコードとして選択されたレコード(注文は例)のために、両方からのレコードをデータベースに送信する必要がある子テーブル(注文など)がいくつかあります。どちらが正しいかを選択する必要があります(たとえば、アドレス)。したがって、これはデータベースを完全に理解する必要がある複雑なプロセスであることがわかります。入力するレコードとして選択されたレコードの両方からデータベースに送信されるレコードを必要とする子テーブル(注文など)がいくつかあります(注文は例です)。他のテーブルでは、どちらが正しいかを選択する必要があります(アドレス例えば)。したがって、これはデータベースを完全に理解する必要がある複雑なプロセスであることがわかります。入力するレコードとして選択されたレコードの両方からデータベースに送信されるレコードを必要とする子テーブル(注文など)がいくつかあります(注文は例です)。他のテーブルでは、どちらが正しいかを選択する必要があります(アドレス例えば)。したがって、これはデータベースを完全に理解する必要がある複雑なプロセスであることがわかります。

重複が多い場合は、数か月間データをクリーンアップして追加している可能性があるため、ツールは非常に重要です。これを行うのは、データベースの専門家やプログラマーではなく、システムユーザーである可能性があります。これは、どのレコードを保持するかについて、ほとんどの判断を下すことができるのは彼らだけだからです。自動生成されたキーを持っている場合でも重複するレコードが存在する可能性があるため、いずれにしても同様のことを行う必要があります。それらを見つけるのはもっと難しいです。

2つのデータベースをマージする簡単な方法はありません(GUIDSを使用している場合でも、自然キーが重複するという問題があります)。

于 2009-05-26T13:58:07.677 に答える
7

これが古いトピックであることは承知していますが、多くの投稿で見られる一般的なアプローチについてコメントする必要があり、SQL クエリを使用してすべてをネイティブに実行しようとしています。このようなソリューションに共通するのは、クエリを適用する前に、その作成とテストにかなりの時間を費やす必要があることです。

そうです - 比較的複雑なクエリを使用して 2 つのデータベースをネイティブにマージできますが、時間を大幅に節約し、サードパーティのツールを無料で使用できます (ほとんどまたはすべてが完全に機能する無料トライアルを利用できます)。

市場にはこれらのものがたくさんあります。他の投稿で既に言及されている Red Gate は最高のツールの 1 つですが、ApexSQL Data DiffdbForgeSQL 比較ツールセットなどを試すこともできます。

于 2013-07-24T11:25:58.570 に答える
4

最善の策は、おそらくRedGate SQLDataCompareなどのサードパーティアプリケーションを使用することです。いくらかのお金がかかりますが、そのスクリプトIMOを書くよりも価値があります。

于 2009-05-26T08:22:30.893 に答える
3

ここ数年でこれを2回行った方法は次のとおりです。http://byalexblog.net/merge-sql-databases

于 2016-05-27T08:57:01.967 に答える
1

IDENTITY として主キーがある場合、ここに私の提案があります (スキーマを変更する必要はありません)。

  1. 設定されるようにすべての外部キーを設定しON UPDATE CASCADEます
  2. 親テーブルの主キー/IDENTITY フィールドを更新し、マージ先の対応するテーブルのフィールドの最大値を追加します (FK は値を子テーブルにカスケードします)。
  3. 子テーブルの PK / IDENTITY フィールドについても同じことを行います
  4. このフォーラムの回答の提案に従い、SET IDENTITY_INSERT親テーブルから始めて子テーブルに移動する各テーブルの挿入の両側で ON / OFFを使用します
于 2010-04-27T17:34:05.107 に答える
0

マージされたデータベースのすべてのテーブルに追加のフィールド (たとえば、DatabaseID と呼ばれる) を追加し、それを主キーに追加するだけです。このようにして、マージされたデータベースに一意のキーを保持しながら、元のキーを保持できます。また、行がどのデータベースからのものかを知ることができます。これがSQL-Hubの機能です。1 回限りの作業であれば、無料試用版でこれを行うことができます。

于 2016-02-11T10:28:46.697 に答える