2012-10-30 74 views
1

我對SQL Server相當陌生,所以如果我說什麼都沒有意義,那麼我很可能會被某些東西困惑。無論如何...有沒有辦法在大於900字節的列上創建唯一約束?

我有一個簡單的映射表。它有兩列,分別是BeforeAfter。我想要的是一個約束,Before列是唯一的。最初它被設置爲主鍵,但是當值太大時會產生錯誤。我嘗試添加一個ID列作爲主鍵,然後將UNIQUE添加到Before列,但我遇到了同樣的問題,最大長度超過900字節(我猜這個約束創建了一個索引)。

我能想到的唯一選擇是將id列更改爲校驗和列,並將其作爲主鍵,但我不喜歡此選項。有沒有不同的方式來做到這一點?我只需要兩個簡單的列。

+1

什麼是RDBMS?什麼是列數據類型?他們需要那麼寬嗎? –

+0

當你說'校驗和'你在說什麼散列? – danihp

+0

我正在使用Microsoft SQL服務器。他們都是nvarchar,是的他們需要那麼寬。 是的散列。將列校驗到它自己的列中。檢查唯一性。 – user1652427

回答

1

我能想到的唯一保證數據庫內唯一性的方法是使用INSTEAD OF觸發器。我提供給MSDN的鏈接有一個檢查唯一性的例子。這個解決方案很可能會很慢,因爲你無法在被檢查的列上編制索引。

通過使用計算列創建一個散列(可能使用Before列的HASHBYTES function),您可以稍微提高它的速度。然後,您可以在該哈希列上創建非唯一索引,並在觸發器內檢查否定的情況 - 即檢查是否存在具有相同哈希值的行並不存在。如果發生這種情況,請退出扳機。如果有另一行使用相同的散列值,則可以對更精確的副本執行更昂貴的檢查,並在用戶輸入重複值時引發錯誤。您也可以通過簡單地比較一個EXISTS()子句中的哈希值和Before值來簡化您的檢查,但是我沒有發揮該解決方案的性能。 (請注意,我提到的HASHBYTES函數本身只能散列最多8000個字節,如果你想要超過這個數量,你將不得不推出你自己的散列函數或者使用CHECKSUM引起的衝突()函數)

+0

哈希值不能超過索引的900字節限制嗎? – user1652427

+0

不,散列函數的要點是產生一個小的固定長度(通常是HASHBYTES,它是128位)數字。 –

+0

哦真棒。我正在測試並獲得像我原本預期的那樣小的值,但HASHBYTES鏈接表示它返回最多8000字節,並且它讓我失望。謝謝! – user1652427

相關問題