0

SQL Server 2008 R2には、次の構造のテーブルがあります

(
  Id     INT NOT NULL PRIMARY KEY,
  Left1  INT NOT NULL,
  Left2  INT NULL,
  Right1 NVARCHAR(128) NOT NULL,
  Right2 NVARCHAR(128) NOT NULL,
  Right3 NVARCHAR(128) NULL,
  Right4 NVARCHAR(128) NULL,
  Right5 NVARCHAR(128) NULL,
  Right6 NVARCHAR(128) NULL
)

これは、システム( "Left")からRight1-6に移動し、別のシステム( "Right")に移動するLeft1とLeft2をマップするために使用されます。

左の列が一意であることを確認する必要があります。これは、一意のインデックスを使用して行ったものであり、左右の組み合わせも一意であることを確認する必要があります。

サポートされている最大列サイズは900バイトであるため、ここではインデックスを使用できません。テーブルをLeft、Right、Left2Rightに分割することは避ける必要があります。これは、非常に面倒で、ユースケースでエラーが発生しやすいためです。

組み合わせの独自性を強制する正しい方法は何ですか?


私の要件は次のとおりです。

  • テーブル全体で、Left1とLeft2に同じ値の行があってはなりません(解決済み)
  • テーブル全体で、Left1、Left2、Right1、Right2、Right3、Right4、Right5、Right6に同じ値の行があってはなりません(ここでヘルプが必要です)
4

2 に答える 2

4

2番目の制約を追加する必要はまったくありません。

に対する独自の制約

Left1, Left2

の重複値を防ぎます

Left1, Left2, Right1, Right2, Right3, Right4, Right5, Right6

最初に最初の2つを複製せずに、これらの8つのフィールドすべてを複製する方法はありません。

于 2011-04-12T17:19:40.513 に答える
1

1つのアイデア:考えられるすべての「Right」値のルックアップテーブルを作成し、それらに整数の代理キーを割り当て、Left2Rightテーブルでそれらの代理キーを使用して、それらに一意の制約を作成します。非正規化され、罪のように醜いですが、それはトリックを行うことができます。


(追加した)

値のハッシュを作成し、それを制限することもできます。貧乏人のバージョンは、チェックサムを使用して計算された行を追加することです。

ALTER TABLE MyTable
 Add RightHash AS checksum(Left1, Left2, Right1, Right2, Right3, Right4, Right5, Right6)

それに一意の制約を追加します(これを行うには、永続化された計算列である必要がある場合があります)。これに関する主な問題は、初期値の異なるセットが同じチェックサム値を生成する可能性があることです。hashbytes関数を介して(はるかに)堅牢なハッシュアルゴリズムの1つを使用できます。これには、同じ制限(重複するハッシュ値の可能性)がありますが、衝突の可能性は大幅に低くなります。

于 2011-04-12T16:18:40.143 に答える