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, tôi sẽ giải quyết điều đó trước tiên.
SQL Server 2014
Ngoài các phương pháp bổ sung danh mục hạn chế dựa trên thảo luận dưới đây SQL Server 2014 cũng cho phép chỉ số phi duy nhất để được chỉ định trực tiếp với cú pháp nội tuyến trên tờ khai biến bảng.
Ví dụ về cú pháp 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*/
);
chỉ số lọc và lập chỉ mục với các cột bao gồm thể hiện không được khai báo với cú pháp này tuy nhiên SQL Server 2016 thư giãn này một chút nữa. Từ CTP 3.1, bây giờ có thể khai báo các chỉ mục đã lọc cho các biến bảng. Bởi RTM nó thể là trường hợp đó bao gồm các cột cũng được phép nhưng vị trí hiện tại là họ "will likely not make it into SQL16 due to resource constraints"
/*SQL Server 2016 allows filtered indexes*/
DECLARE @T TABLE
(
c1 INT NULL INDEX ix UNIQUE WHERE c1 IS NOT NULL /*Unique ignoring nulls*/
)
SQL Server 2000 - 2012
Tôi có thể tạo một chỉ mục trên Tên?
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])
)
Câu trả lời chi tiết hơn bên dưới.
Bảng truyền thống trong SQL Server có thể có chỉ mục nhóm hoặc được cấu trúc là heaps.
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 sẽ tự động thêm uniqueifier vào bất kỳ khóa trùng lặp nào để làm cho chúng trở thành duy nhất.
Chỉ mục không được nhóm cũng có thể được khai báo rõ ràng là duy nhất. Nếu không cho trường hợp không duy nhất SQL Server adds the row locator (phím chỉ mục nhóm hoặc RID cho một đống) cho tất cả các phím 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 ngầm bằng cách tạo ra ràng buộc UNIQUE
hoặc PRIMARY KEY
. Sự khác biệt giữa các kiểu ràng buộc này là khóa chính phải nằm trên các cột không có giá trị rỗng. Các cột tham gia vào một ràng buộc duy nhất có thể là nullable. (mặc dù việc thực thi SQL Server của các ràng buộc duy nhất trong sự hiện diện của NULL
s không phải là 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 nhiều ràng buộc duy nhất.
Cả hai ràng buộc logic này được triển khai thực tế với chỉ mục duy nhất. Nếu không xác định rõ ràng nếu không PRIMARY KEY
sẽ trở thành chỉ số clustered và ràng buộc duy nhất không cụm nhưng hành vi này có thể được ghi đè bằng cách xác định CLUSTERED
hoặc NONCLUSTERED
một cách rõ ràng với việc kê khai chế (Ví dụ cú pháp)
DECLARE @T TABLE
(
A INT NULL UNIQUE CLUSTERED,
B INT NOT NULL PRIMARY KEY NONCLUSTERED
)
Như một kết quả của các bên trên các chỉ mục sau có thể được tạo ngầm định 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 yêu cầu 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ỉ số không độc nhất không được nhóm trên Name
được mô phỏng bằng một chỉ số duy nhất trên Name,Id
(nhớ lại rằng SQL Server sẽ tự động thêm khóa chỉ mục nhóm vào khóa NCI không duy nhất).
Một chỉ mục nhóm không độc đáo cũng có thể đạt được bằng cách thêm một cột IDENTITY
theo cách thủ công để hoạt động như một bộ 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ô phỏng chính xác về cách một chỉ mục nhóm không thực hiện bình thường thực sự được triển khai trong SQL Server vì điều này thêm "Uniqueifier" vào tất cả các hàng. Không chỉ những người yêu cầu nó.
Có chi phí trong việc tạo cả hai loại bảng tạm thời; và nếu bạn có quá nhiều dữ liệu trong đó bạn cần một chỉ mục, đó có thể là thời gian để xem xét bằng cách sử dụng một bảng thực; mà bạn thiết lập để giao dịch an toàn; lọc theo spid hoặc id người dùng và sau đó xóa nó ở cuối. Các bảng v bảng tạm thời thực sự đều có những thăng trầm nhưng nếu hiệu suất là một vấn đề; thử nó với một cái bàn thật. – u07ch
Một bảng tạm thời 'IS' là một bảng thực, nó chỉ biến mất khi bạn hoàn thành. Sự khác biệt thực sự (khác với nó sẽ tự động biến mất) là nó ở trong TempDB. Điều này thực sự rất lớn khi nói đến các chỉ mục và các ràng buộc bởi vì bạn có thể kết thúc với các xung đột tên, không chỉ với các đoạn mã lệnh khác mà còn với việc thực thi mã trong các cơ sở dữ liệu khác trong cá thể của bạn. – bielawski
@bielawski đây là biến bảng không phải là bảng tạm thời. Các biến bảng không cho phép các ràng buộc được đặt tên rõ ràng, tên được tạo bởi hệ thống được đảm bảo là duy nhất.Chúng cho phép các chỉ mục được đặt tên từ năm 2014 nhưng đó không phải là vấn đề vì chỉ mục chỉ cần được đặt tên duy nhất trong một đối tượng không phải trên các đối tượng. –