2007-11-04

超過資料長度限制的唯一條件約束 -- Over Unique Constraint


在 SQL Server 2000/2005 上,可以建立唯一(UNIQUE)的條件約束來確保資料不會重複。
但是卻有以下的限制:SQL Server 2005 為所有索引鍵資料行的總大小保留 900 個位元組的上限。
參考網址:索引鍵的大小上限

因此,當資料長度超過 900 位元組時,將無法使用唯一(UNIQUE)的限制條件。

或許可以嘗試以下的方式來解決此問題:
USE Northwind
GO

-- cdata 資料行的長度超過 900 byte。
CREATE TABLE coluqMax
(sid int, cdata char(901))
GO

-- 建立失敗
CREATE UNIQUE INDEX ixuq01 
ON coluqMax(cdata)
GO

/*
訊息 1944,層級 16,狀態 1,行 1
並未建立索引 'ixuq01'。這個索引中有一索引鍵的長度至少為 901 個位元組。允許的最大索引鍵長度為 900 個位元組。

*/

-- 多增加一個 Computed checksum Column
CREATE TABLE coluqMax01
(sid int, cdata char(901),
chksum AS BINARY_CHECKSUM(cdata))
GO

CREATE UNIQUE INDEX ixuq01 
ON coluqMax01(chksum)
GO

-- 新增資料
INSERT coluqMax01 VALUES(1,'A')
INSERT coluqMax01 VALUES(2,'B')
INSERT coluqMax01 VALUES(3,'A')

/*
訊息 2601,層級 14,狀態 1,行 1
無法以唯一索引 'ixuq01' 在物件 'dbo.coluqMax01' 中插入重複的索引鍵資料列。
陳述式已經結束。
*/

沒有留言:

張貼留言