2010-12-02 7 views
1

データベーステーブルが多数あり、指定されたプライマリキーがありません。スーパーキーのリストもありません。すべての候補キー/列を繰り返し試す以外にも、SQLを使用して、キーのサブセットが自分のテーブルの一意の識別子を作成できるかどうかを判断する方法がありますか?データベーステーブルのユニークな識別子を決定しようとしています

例えば、テーブルは4列名、姓、住所や郵便番号を持っていることと私は見たデータは次のとおりです。この場合、

John, Smith, 1 main st, 00001 
Mary, Smith, 1 main st, 00001 
Mary, Smith, 2 sub st, 00002 

、私は、最初の最後とジップなどが必要になります私のユニークなキー。

John, Smith, 1 main st, 00001 
John, Smith, 1 main st, 00001 

この場合、固有のキーはありません。

私のテーブルの作成やデータベースの正規化にはコメントしないでください。実際の答えを見つけようとしています。ありがとう。

これは私の質問です:反復的にすべての候補キー/列を試す以外にも、SQLを使用してキーのサブセットが自分のテーブルの一意の識別子を作ることができるかどうかを調べる方法がありますか?

答えて

3

のため人のための1つずつに分離することであることはできません組み合わせが主キーを作ることができるかどうかを調べる。既存のデータセットに対して優れた主キーを作成するかどうかを見つけることができます。あなたは、フィールドのセットが候補であるかどうか、あなたは(ロールアップしてグループ・バイを使用して)それらのフィールドの明確なをカウントすることができますし、2つのデータベースを比較する場合count (*)

5

この場合の一意の値のサブセットを探すことは、特定のデータセットに非常に特有のようです。あなたが今日サブセットに到着し、明日新しい行を挿入できない場合はどうなりますか?

自動インクリメント整数のような人工のキーを使用します。

+0

ありがとうございます。私は実際には2つのデータベースを比較しようとしていますが、それらを比較するキーを見つけることはできません。 –

+0

私は人工的なキーを信じていますが、ユニークな制約でデータベースに組み込むべき自然なキーがあるとします。データを分析することを避けるために人工的なキーを作成するだけでは貧弱な方法です。 – HLGEM

4

要するに、いいえ、T-SQLでこれを行う方法はありません。

私のアドバイス:ID INT IDENTITY PRIMARY KEYの列をテーブルに追加するだけです。一意であることが保証されています。作成すると自動的に塗りつぶされます。速くて簡単です。これは本当にユニークですか?一意性に違反する行の組み合わせがありますか?......

ちょうどそれを行う - それは行くのが最も簡単な方法です!

+1

+ 1の単語を使用すると: "自動" ....私の新しいお気に入り:-) – SheldonH

0

このスキーマで更新異常があります あなたは彼のアドレス

より良いアプローチを知らなくても人は3つのテーブル、PersonAddress

> perons: id,firstname, lastname 
> address: id,address: 
> personaddress: personid, addressid 
あなたがすることはできません
+0

OPはデータ構造の変更にオープンしていないようです –

+0

これは後でデータセットが大きくなる –

+0

は、「あなたは、[追加しますか?]ができない人が彼の住所を知らなくても?」コメントをいただきありがとうございます。私はDBを設定していないので、スキーマを制御できません。 –

2

とその比較検索するに

select a,b,c,d 
from mytable 
having count(*) > 1 
group by a,b,c,d 

すべての列を含むソースデータベース内に重複する行が存在するかどうかを確認できます。

は、それは組み合わせが主キーを作る「ことができます」場合は、見つけることができないターゲット・システム

0

に存在するかどうかを確認するために「行キー」としてすべての列を使用します。

私は実際にこれに反対、私は最も簡単な、最も生々しい方法はCASTことです(テーブルの列のすべての可能な順列を選択して、単一のユニークな値に各順列を結合しますクエリを記述することは可能だと思いますそれらをすべてVARCHARに渡して、それらをスペーサー文字と接続してください - より良い方法はある種のハッシュ関数になります)。あなたはその後、(3列の場合)P1、P12、P123、P2、P23、P3などのような列のセットでしょう単一パスで

。その後、各順列列のCOUNT(DISTINCT)対COUNT(*)でクエリを行うことができますし、ユニークである順列が表示されます。それは任意のテーブルの上に動作しますように、私はSQL Serverの列の制限について知らないが、あなたはおそらく、それを作ることができ、動的SQLを使用して

+0

私はもちろん、これらの順列が将来的にユニークであると思われることは確かではないn8wrlに同意する。 – thomaspaulb

+0

確かに、それは1年か2年かかるクエリです。そのためにOPは何か他のものを探しています。 – PerformanceDBA

1

はるかに高速方法があります。

エンタープライズDBMSは、長年にわたってそれを持っていたが、MS SQL Server 2005の(2008で使用可能)以降HashBytes()機能を提供してきました。列をCHAR()(MSのVARCHAR)に変換して連結します。その後それらをハッシュします。ハッシュを比較してください。 1つのSELECTコマンドで2つのテーブルを比較できます。 IIRCは1行につき最大8000文字です。

(この回答を使用する場合は、回答の選択を元に戻してやり直してください)

関連する問題