Sql-Server
對多列的唯一約束,其中一列已經有索引
關於“唯一”與“索引”的內容很多,我讀了很多,但仍然找不到我的案例的解釋。
簡而言之,我的數據庫目前在兩列上有一個非聚集索引。由於數據重複,我們有一些不一致的狀態,我想在表的所有四列上添加一個唯一約束。由於“唯一”將在引擎蓋下創建一個索引,保留舊索引是否仍然有意義?
更具體地說,它類似於:
create table Stuff ( id PK, col1 varchar not null, col2 varchar not null, col3 bigint not null, col4 bigint not null); create index for_search on Stuff (col3, col4); alter table Stuff add constraint data_integrity_above_all UNIQUE (col1, col2, col3, col4);
如果答案是“是”,那麼指定
UNIQUE (col3, col4, col1, col2);
列順序是否是一個很好的舉措,或者它是否過於隱含並且在維護時不能很好地結束?有關數據性質的更多資訊:
col3
並且col4
是另一個表 ID(但不是 FK);col1
,col2
——使用者數據。數據庫:SQL Server 2012
如果唯一約束(及其關聯的唯一索引)的目的只是為了強制唯一性,那麼您應該將唯一約束的列順序更改為
col3, col4, col1, col2
,然後您的索引將是多餘的並且可以刪除。否則,在您的表上使用具有不同前導列的另一個索引可能會帶來一些好處,您應該考慮您的工作量,如果經常使用謂詞訪問表,
col1
或者同時在兩者col1
上使用謂詞col2
,也許這是一個很好的情況,首先有這些列在關鍵。@srutzky 關於聚集索引的評論也很有價值,值得考慮。