2011-01-24 37 views
0

我正在使用sql server 2008,我的列是nvarchar(max)。 如何使用觸發器模擬該列中的唯一約束?使用觸發器模擬唯一約束

這可能嗎?

+1

爲什麼你不能創建約束/索引?任何具體原因?與觸發器相比,這將是一種更好的方式。 – Chandu 2011-01-24 22:34:44

+1

@Cyber​​nate:你不能在nvarchar(max)上創建唯一的索引。請參閱:[爲什麼我不能對nvarchar(max)進行約束?](http://stackoverflow.com/questions/1184490/why-cant-i-put-a-constraint-on-nvarcharmax) – 2011-01-24 22:36:19

+0

明白了....我沒有意識到這一點。 Thx – Chandu 2011-01-24 22:39:44

回答

1

每喬鏈接Why can't I put a constraint on nvarchar(max)?您不能創建一個唯一約束。

但是,你可以僅在第800(nvarchar的)字符和索引唯一添加COMPUTED列。

你可以加強與服用checksumhashbytes(或兩者)爲nvarchar(max)列,並創建一個針對(前800 +哈希)獨特

不要採取校驗或HASHBYTES alone因爲碰撞是司空見慣的,你甚至會拒絕非重複。

編輯:對於一個更好的方法,使用這種方法

  • 採取的第一個8000個字符的HASHBYTE作爲觸發計算列和索引它
  • ,你可以使用的HASHBYTE插入行作爲一個快速過濾文本來縮小實際需要記錄的檢查重複
 
    SELECT .. 
    FROM TBL T JOIN INSERTED I .. 
    WHERE HASHBYTE(I.vcmax) = T.ComputedHB 
     AND I.vcmax = T.vcmax 
     AND I.ID != T.ID -- exclude self 

注 - ComputedHB是計算列

如果您發現任何記錄,那麼有一個「唯一約束」違反

2

使用HASHBYTES創建列的哈希值,並把唯一約束上。使用SHA或MD5,您不會意外碰撞(但如果您真的偏執狂使用兩種不同算法的哈希)!