3

varchar(500)の列​​を一意にする必要があります。
一意の制約を設定すると、一意のサイズ制限を超えるため、機能しません。
それでは、列をユニークにするための最良の戦略は何でしょうか?

4

2 に答える 2

4

そのHASHを使用して別のフィールドを作成し、ハッシュフィールドにvarchar(500)を配置します。UNIQUE CONSTRAINTHASHBYTES('md5', MyLongVarcharField)

これによりパフォーマンスが低下しますが、varchar(500)一意性を強制する必要がある場合は、パフォーマンスがとにかく考慮事項の最前線にないことを前提としています。

編集:

明確にするために、2つの文字列が同じ128ビットハッシュ値を出力する可能性はです1 in 340,282,366,920,938,000,000,000,000,000,000,000,000。衝突する可能性は低いですが、断固として不可能ではありません。

それでも心配な場合は、160ビットのアルゴリズムを使用SHAできます。SHA1

于 2011-10-03T18:28:31.703 に答える
1

INSERTおよびUPDATEでDMLトリガーを使用できます。これにより、ハッシュを使用する必要がなくなります。簡単にするためにAFTERトリガーを選択しましたが、これはINSTEADOFトリガーでも簡単に実行できます。

create trigger dml_EnforceUniqueVal
on dbo.UniqueBigColumn
after insert, update
as  
    declare @CountOfRepeats int
    select @CountOfRepeats = COUNT(*)
    from UniqueBigColumn
    where somestring in
    (
        select somestring
        from inserted
    )

    if @CountOfRepeats > 1
        rollback
go
于 2011-10-03T22:03:03.513 に答える