0

SQL Server を使用してテーブルに一意のインデックス キーを定義する必要があります。

例えば:

ID    Contact1     Contact2    RelationType
-------------------------------------------------------------------
1     1            2           sister       // 1 is the 2nd sister
2     3            4           brother      // 3 is the 4th brother
3     5            1           father       // 5 is the 1st father
4     2            1           sister       // bad entry !!!

では、上の表の4番目のIDのような間違ったデータを一意のインデックスキーを使用して挿入できないようにするにはどうすればよいでしょうか?

4

3 に答える 3

1

結合された 2 つの数値 (小さい方が先) の文字表現を含む計算列を作成し、計算列に一意の制約を作成できます。

case when Contact1 > Contact2 then convert(varchar, Contact2) + convert(varchar, Contact1)
else convert(varchar, Contact1) + convert(varchar, Contact2)

このソリューションでは、5, 3 を入力できますが、3, 5 IF 5, 3 が既に存在する場合は入力できません。

于 2012-05-13T15:34:55.437 に答える
1

Contact1 の値を小さくするチェック制約と組み合わせて一意のキーを使用できます。

create table Relation
(
  ID int identity primary key,
  Contact1 int not null,
  Contact2 int not null,
  unique (Contact1, Contact2),
  check (Contact1 < Contact2)
)
于 2012-05-13T14:50:40.710 に答える
0

モデル化するロジック/ルールは何ですか? これに対する答えを知らなければ、問題が何であるかを正確に知ることは困難です。

そうは言っても、テーブルが非正規化されているように見え、制約の適用が複雑になる可能性があります。単純に「連絡先は id に対して一意である」ことを強制しようとしている場合は、連絡先 2 列を取り出して、連絡先 1 に一意の制約を設定します。

于 2012-05-13T16:50:41.590 に答える