2009-07-26 29 views
38

Tại sao tôi không thể tạo ràng buộc trên cột nvarchar(max)? SQL Server sẽ không cho phép tôi đặt một ràng buộc duy nhất trên nó. Nhưng, nó cho phép tôi tạo ra một ràng buộc duy nhất trên một cột nvarchar(100).Tại sao tôi không thể đặt một ràng buộc trên nvarchar (tối đa)?

Cả hai cột này đều là NOT NULL. Có lý do gì khiến tôi không thể thêm ràng buộc vào cột nvarchar(max) không?

Trả lời

23

Vì MAX thực sự lớn (2 -1 bytes) và có thể dẫn đến sự cố máy chủ nếu máy chủ phải kiểm tra tính duy nhất trên các mục có kích thước nhiều megabyte.

Từ tài liệu trên Create Index, tôi cho rằng điều này cũng đúng với các ràng buộc duy nhất.

Kích thước tối đa cho phép của giá trị chỉ mục kết hợp là 900 byte.

EDIT: Nếu bạn thực sự cần tính độc đáo, bạn có thể, có khả năng xấp xỉ nó bằng cách tính toán một băm của dữ liệu và lưu trữ trong một chỉ số duy nhất. Ngay cả một băm lớn cũng đủ nhỏ để vừa với một cột có thể lập chỉ mục. Bạn sẽ phải tìm ra cách xử lý các xung đột - có thể kiểm tra thủ công các va chạm và pad dữ liệu (thay đổi giá trị băm) nếu tìm thấy xung đột.

+0

Để kết thúc, có một số giá trị tối đa được đặt mà chỉ mục có thể là hoặc chỉ là 'không phải MAX' không? –

+0

Tôi nghĩ chiều dài tối đa của 'nvarchar' và' varchar' là ở đâu đó trong phạm vi 8000, trừ khi bạn sử dụng MAX. – Thorarin

+1

Tổng kích thước tối đa của tất cả các cột chính của chỉ mục là 900 byte. http://msdn.microsoft.com/en-us/library/ms191241.aspx –

4

Ràng buộc duy nhất thực sự là chỉ mục và không thể sử dụng nvarchar (tối đa) làm khóa trong chỉ mục.

72

nvarchar(max) thực sự là một loại dữ liệu khác từ nvarchar(integer-length). Đặc điểm của nó giống với kiểu dữ liệu text không được chấp nhận.

Nếu nvarchar(max) giá trị trở nên quá lớn, giống như text, nó sẽ được lưu trữ bên ngoài hàng (liên tiếp bị hạn chế đến 8000 byte tối đa) và một con trỏ để nó được lưu trữ trong hàng riêng của mình. Bạn không thể lập chỉ mục hiệu quả một trường lớn như vậy và thực tế là dữ liệu có thể được lưu trữ ở một nơi nào đó khác làm phức tạp hơn nữa việc tìm kiếm và quét chỉ mục.
Một ràng buộc duy nhất đòi hỏi một chỉ mục được thực thi và kết quả là, các nhà thiết kế SQL Server đã quyết định không cho phép tạo ra một ràng buộc duy nhất trên nó.

+5

Tất nhiên, họ có thể đã sử dụng một phiên bản của CRC hoặc MD5 để làm cho các ràng buộc giá rẻ để kiểm tra với xác suất quá cao. Trong bất kỳ trường hợp nào; họ đã không ... –

+0

Cảm ơn bạn đã giải thích, bạn đã giúp giải thích điều này tốt hơn tôi có thể! –

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