2010-08-17 40 views
5

Tôi có một bảng với chỉ mục UNIQUE 12 cột. \d sales hiển thị sales_uq UNIQUE, btree (a1, a2, a3, ... a12).Chỉ số UNREQUE của PostgreSQL không phải là duy nhất?

tôi làm các truy vấn sau đây:

SELECT a1, a2, a3, ... a12 FROM sales GROUP BY a1, a2, a3, ... a12 HAVING count(1) > 1; 

và tôi nhận được một loạt các kết quả. Làm thế nào là có thể ?! Có thể là chỉ mục ở đó nhưng bằng cách nào đó bị vô hiệu hóa? Hoặc có thể có một số vấn đề với NULLs? Hoặc với số dấu chấm động (hai cột trong chỉ mục là loại double precision)?

Trả lời

11

vì hai NULL không so sánh như nhau, chúng chơi trò chơi vui nhộn với các ràng buộc UNIQUE.

Xem đoạn cuối cùng của chế UNIQUE trong PostgreSQL documentation:

Nói chung, một hạn chế duy nhất là vi phạm khi có hai hoặc nhiều hàng trong bảng nơi các giá trị của tất cả các cột bao gồm trong ràng buộc bằng nhau. Tuy nhiên, hai giá trị null không được coi là bằng nhau trong so sánh này. Điều đó có nghĩa là ngay cả trong sự hiện diện của một ràng buộc duy nhất nó có thể lưu trữ các hàng trùng lặp có chứa giá trị rỗng trong ít nhất một trong các cột bị ràng buộc.

+1

Chết tiệt, điều này thật tệ. Tôi biết NULL là không bằng NULL, nhưng đối với một số lý do tôi đã mong nó sẽ khác nhau trong chỉ mục. :) – ibz

+0

@ionut bizau - tất nhiên, niềm vui thực sự là, cho mục đích GROUPing, NULL được nhóm lại với nhau. Và như các trạng thái tài liệu, một số máy chủ khác (ví dụ: SQL Server) thực hiện các ràng buộc UNIQUE chỉ cho phép một NULL (mặc dù điều này vi phạm đặc tả SQL ANSI) –

2

Một đôi là inexact, đó là lý do tại sao điều này có thể xảy ra. Sử dụng một kiểu dữ liệu chính xác và bạn sẽ không gặp vấn đề như thế này.

+0

Mặc dù điều này không giải quyết được vấn đề của tôi, đó là một điểm thực sự tốt. Tôi sẽ xem xét việc thay đổi cơ sở dữ liệu để sử dụng NUMERIC. Cảm ơn. – ibz

+0

Chẳng hạn như 45.454545454 luôn dẫn đến cùng một giá trị không chính xác cho nó sẽ dẫn đến cùng một số không chính xác khiến cho hai hàng cột giống nhau không? Hoặc bạn đang nói 45.454545454 sẽ dẫn đến 45.455 và đôi khi 45.454? Tất nhiên những con số tôi đang sử dụng chỉ dành cho mục đích thảo luận. – Kuberchaun

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