Câu hỏi được gắn thẻ SQL Server 2000 nhưng vì lợi ích của những người phát triển trên phiên bản mới nhất trước tiên tôi sẽ giải quyết vấn đề đó.
Máy chủ SQL 2014
Ngoài các phương pháp thêm các chỉ mục dựa trên ràng buộc được thảo luận bên dưới SQL Server 2014 cũng cho phép các chỉ mục không duy nhất được chỉ định trực tiếp bằng cú pháp nội tuyến trên các khai báo biến bảng.
Cú pháp ví dụ cho điều đó là dưới đây.
/*SQL Server 2014+ compatible inline index syntax*/
DECLARE @T TABLE (
C1 INT INDEX IX1 CLUSTERED, /*Single column indexes can be declared next to the column*/
C2 INT INDEX IX2 NONCLUSTERED,
INDEX IX3 NONCLUSTERED(C1,C2) /*Example composite index*/
);
Các chỉ mục và chỉ mục được lọc với các cột được bao gồm hiện không thể được khai báo bằng cú pháp này tuy nhiên SQL Server 2016 giúp thư giãn điều này hơn một chút. Từ CTP 3.1, giờ đây có thể khai báo các chỉ mục được lọc cho các biến bảng. Theo RTM, có thể trường hợp bao gồm các cột cũng được cho phép nhưng vị trí hiện tại là chúng "có thể sẽ không được đưa vào SQL16 do hạn chế tài nguyên"
/*SQL Server 2016 allows filtered indexes*/
DECLARE @T TABLE
(
c1 INT NULL INDEX ix UNIQUE WHERE c1 IS NOT NULL /*Unique ignoring nulls*/
)
Máy chủ SQL 2000 - 2012
Tôi có thể tạo một chỉ mục trên Tên không?
Câu trả lời ngắn gọn: Có.
DECLARE @TEMPTABLE TABLE (
[ID] [INT] NOT NULL PRIMARY KEY,
[Name] [NVARCHAR] (255) COLLATE DATABASE_DEFAULT NULL,
UNIQUE NONCLUSTERED ([Name], [ID])
)
Một câu trả lời chi tiết hơn dưới đây.
Các bảng truyền thống trong SQL Server có thể có một chỉ mục được nhóm hoặc được cấu trúc thành các đống .
Các chỉ mục được nhóm có thể được khai báo là duy nhất để không cho phép các giá trị khóa trùng lặp hoặc mặc định thành không duy nhất. Nếu không phải là duy nhất thì SQL Server âm thầm thêm một bộ duy nhất vào bất kỳ khóa trùng lặp nào để làm cho chúng là duy nhất.
Các chỉ mục không được nhóm cũng có thể được khai báo rõ ràng là duy nhất. Mặt khác, đối với trường hợp không phải là duy nhất, SQL Server thêm trình định vị hàng (khóa chỉ mục được nhóm hoặc RID cho một heap) cho tất cả các khóa chỉ mục (không chỉ trùng lặp) điều này một lần nữa đảm bảo chúng là duy nhất.
Trong SQL Server 2000 - 2012, chỉ mục trên các biến bảng chỉ có thể được tạo hoàn toàn bằng cách tạo UNIQUE
hoặc PRIMARY KEY
ràng buộc. Sự khác biệt giữa các loại ràng buộc này là khóa chính phải nằm trên (các) cột không null. Các cột tham gia vào một ràng buộc duy nhất có thể là null. (mặc dù việc triển khai các ràng buộc duy nhất của SQL Server với sự hiện diện của NULL
s không theo quy định trong Tiêu chuẩn SQL). Ngoài ra một bảng chỉ có thể có một khóa chính nhưng có nhiều ràng buộc duy nhất.
Cả hai ràng buộc logic này được thực hiện bằng vật lý với một chỉ mục duy nhất. Nếu không được chỉ định rõ ràng nếu không thì PRIMARY KEY
sẽ trở thành chỉ mục được nhóm và các ràng buộc duy nhất không được phân cụm nhưng hành vi này có thể được ghi đè bằng cách chỉ định CLUSTERED
hoặc NONCLUSTERED
rõ ràng bằng khai báo ràng buộc (Cú pháp ví dụ)
DECLARE @T TABLE
(
A INT NULL UNIQUE CLUSTERED,
B INT NOT NULL PRIMARY KEY NONCLUSTERED
)
Kết quả của các chỉ mục sau đây có thể được tạo hoàn toàn trên các biến bảng trong SQL Server 2000 - 2012.
+-------------------------------------+-------------------------------------+
| Index Type | Can be created on a table variable? |
+-------------------------------------+-------------------------------------+
| Unique Clustered Index | Yes |
| Nonunique Clustered Index | |
| Unique NCI on a heap | Yes |
| Non Unique NCI on a heap | |
| Unique NCI on a clustered index | Yes |
| Non Unique NCI on a clustered index | Yes |
+-------------------------------------+-------------------------------------+
Điều cuối cùng đòi hỏi một chút giải thích. Trong định nghĩa biến bảng ở đầu câu trả lời này, chỉ mục không phân cụm không duy nhất trên Name
được mô phỏng bởi một chỉ mục duy nhất trên Name,Id
(nhắc lại rằng SQL Server sẽ âm thầm thêm khóa chỉ mục được phân cụm vào khóa NCI không duy nhất).
Một chỉ mục cụm không duy nhất cũng có thể đạt được bằng cách thêm thủ công một IDENTITY
cột để hoạt động như một công cụ duy nhất.
DECLARE @T TABLE
(
A INT NULL,
B INT NULL,
C INT NULL,
Uniqueifier INT NOT NULL IDENTITY(1,1),
UNIQUE CLUSTERED (A,Uniqueifier)
)
Nhưng đây không phải là một mô phỏng chính xác về cách một chỉ mục cụm không duy nhất thường thực sự được triển khai trong SQL Server vì điều này thêm "Trình duy nhất" vào tất cả các hàng. Không chỉ những người yêu cầu nó.