2009-02-19 33 views
49

Tôi có một bảng có khóa chính, nhưng tôi muốn hai cột khác bị ràng buộc nên sự kết hợp của hai cột được đảm bảo luôn là duy nhất.Sự khác biệt giữa Khóa duy nhất và chỉ mục với IsUnique = Có?

(một ví dụ câm:. Trong một bảng BOOKS, cột IBAN là khóa chính, nhưng sự kết hợp của các Tiêu đề và cột Tác giả cũng nên luôn luôn là duy nhất)

Trong Studio SQL Server Management nó có thể để tạo chỉ mục mới và đặt IsUnique thành Có hoặc tôi có thể tạo Khóa duy nhất mới.

Sự khác nhau giữa hai cách tiếp cận là gì và cách nào phù hợp nhất với mục đích nào?

+5

Chỉ trong trường hợp có liên quan: nếu bạn cần cho phép nhiều hàng là NULL nhưng bất kỳ hàng nào không NULL phải là UNIQUE: hoặc thực thi bằng Trình kích hoạt hoặc VIEW với tiêu đề UNIQUE INDEX - CREATE VIEW xxx AS SELECT, Tác giả TỪ SÁNG Ở ĐÂY (Tiêu đề + Tác giả) KHÔNG phải là NULL rồi tạo chỉ mục trên đó Xem – Kristen

+0

Cảm ơn Kirsten, đó là thông tin hữu ích! – JacobE

+1

Xem thêm http://stackoverflow.com/questions/366186/is-the-sql-server-unique-key-also-an-index –

Trả lời

35

Tạo ràng buộc UNIQUE là tuyên bố rõ ràng hơn về quy tắc. Thuộc tính IsUnique của chỉ mục là chi tiết triển khai - cách quy tắc được triển khai, không phải là quy tắc quy tắc là gì. Hiệu quả là như nhau mặc dù.

+0

whats about performance? – pylover

+1

@pylover: trong một số trường hợp, ràng buộc (ví dụ: khóa ngoại hoặc không phải là null) có thể cải thiện hiệu suất bằng cách cung cấp thông tin hữu ích cho trình tối ưu hóa nếu không. Trong trường hợp tính duy nhất tôi tưởng tượng không có sự khác biệt giữa một ràng buộc và chỉ là một chỉ mục, nhưng không chắc chắn 100%. –

0

chỉ mục duy nhất là các khóa duy nhất.

6

Chỉ cần để bạn biết đấy, khi bạn tạo một độc đáo hạn SQL Server sẽ tạo ra một chỉ số đằng sau hậu trường

7

Có sự khác biệt rõ ràng giữa 2. Một hạn chế duy nhất xác định những sự kết hợp của các cột phải là độc nhất. Một chỉ mục duy nhất chỉ là một cách để đảm bảo các thông tin trên luôn hợp lệ. Nhưng có thể có một chỉ mục không duy nhất hỗ trợ một ràng buộc duy nhất. (nếu ràng buộc là có thể trì hoãn = Chỉ phải có giá trị tại thời điểm cam kết nhưng được phép bị phá vỡ ở giữa giao dịch)

4

Một điều tôi thấy khó khăn là trong SSMS scripting của các khóa duy nhất được đặt thành true theo mặc định nhưng tập lệnh chỉ mục được đặt thành Sai. Khi tôi sử dụng Script Table Như menu ngữ cảnh từ SSMS, tôi đã không nhận được các chỉ mục duy nhất của mình.

Ngoài ra nếu loại được đặt thành Khóa duy nhất, bạn không thể thay đổi cài đặt "Bỏ qua khóa trùng lặp". Trước tiên, bạn đã thay đổi loại từ Unique Key thành Index sau đó bạn có thể đặt Ignore Duplicate Keys thành true.

Các vấn đề liên quan