Sql-Server

對多列的唯一約束,其中一列已經有索引

  • November 11, 2016

關於“唯一”與“索引”的內容很多,我讀了很多,但仍然找不到我的案例的解釋。

簡而言之,我的數據庫目前在兩列上有一個非聚集索引。由於數據重複,我們有一些不一致的狀態,我想在表的所有四列上添加一個唯一約束。由於“唯一”將在引擎蓋下創建一個索引,保留舊索引是否仍然有意義?

更具體地說,它類似於:

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 關於聚集索引的評論也很有價值,值得考慮。

引用自:https://dba.stackexchange.com/questions/154906