1

私はSQLServerにかなり慣れていないので、私が言っても意味がない場合は、何かに混乱している可能性があります。ともかく...

簡単なマッピングテーブルがあります。2つの列、BeforeおよびがありAfterます。私が欲しいのは、Before列が一意であるという制約だけです。元々は主キーに設定されていましたが、値が大きすぎるとエラーが発生しました。ID主キーとして列を追加UNIQUEしてから列に追加しようとしましたBeforeが、最大長が900バイトを超えるという同じ問題があります(制約によってインデックスが作成されると思います)。

私が考えることができる唯一のオプションは、id列をチェックサム列に変更してそれを主キーにすることですが、私はこのオプションが嫌いです。これを行う別の方法はありますか?必要なのは2つの単純な列だけです。

4

1 に答える 1

1

データベース内での一意性を保証する唯一の方法は、INSTEAD OFトリガーを使用することです。私が MSDN に提供したリンクには、一意性をチェックするための例があります。チェックされている列にインデックスを付けることができないため、このソリューションは実際には非常に遅くなる可能性があります。

計算列を使用して、おそらくHASHBYTES 関数を使用して、Before 列のハッシュを作成することで、多少高速化できます。次に、そのハッシュ列に一意ではないインデックスを作成し、トリガー内で負のケースをチェックします。つまり、同じハッシュを持つ行が存在しないかどうかを確認します。その場合は、トリガーを終了します。同じハッシュを持つ別の行がある場合は、正確な重複についてよりコストのかかるチェックを実行し、ユーザーが重複する値を入力するとエラーを発生させることができます。また、1 つの EXISTS() 句でハッシュ値と Before 値の両方を比較するだけでチェックを簡素化できる場合もありますが、そのソリューションのパフォーマンスについては試していません。

(私が参照した HASHBYTES 関数自体は最大 8000 バイトまでしかハッシュできないことに注意してください。それよりも大きくしたい場合は、独自のハッシュ関数をロールするか、CHECKSUM() 関数によって引き起こされる衝突に対処する必要があります)

于 2012-10-31T12:00:31.540 に答える