Ràng buộc cột duy nhất tùy chỉnh, chỉ được thi hành nếu một cột có giá trị cụ thể


19

Có thể có một ràng buộc cột duy nhất tùy chỉnh như sau? Giả sử tôi có hai cols subsettypecả hai chuỗi (mặc dù các kiểu dữ liệu có thể không quan trọng).

Nếu typelà "đúng", thì tôi muốn sự kết hợp typesubsetlà duy nhất. Nếu không, không có ràng buộc. Tôi đang sử dụng PostgreSQL 8.4 trên Debian.


Câu trả lời:


31

Nói cách khác, bạn muốn subsetlà duy nhất nếu type = 'true'.
Một chỉ mục duy nhất một phần sẽ làm điều đó:

CREATE UNIQUE INDEX tbl_some_name_idx ON tbl (subset) WHERE type = 'true';

Bằng cách này, bạn thậm chí có thể thực hiện kết hợp với NULLduy nhất, điều không thể khác - như chi tiết trong câu trả lời liên quan này:
ràng buộc duy nhất nhiều cột PostgreQuery và các giá trị NULL


Cảm ơn Erwin. Tôi đã không thấy tùy chọn này khi tôi xem tài liệu. Một liên kết trực tiếp hơn là postgresql.org/docs/cản/interactive/indexes-partial.html . Xem ví dụ 11-3.
Faheem Mitha

@FaheemMitha: Tôi đã liên kết một cấp cao hơn, vì bạn cần kết hợp một chỉ mục một phần với một chỉ mục duy nhất .
Erwin Brandstetter 23/03/13

1
@Erwin Trang đó (về chỉ mục một phần), có một ví dụ với chỉ mục duy nhất một phần.
ypercubeᵀᴹ

@ypercube: À, đúng rồi. Đó là liên kết tốt hơn. Tôi đã thay đổi câu trả lời của tôi để chỉ đến chương cuối cùng đó.
Erwin Brandstetter 23/03/13

6

Đây là bổ sung cho câu trả lời của Erwin ở trên, nhưng PostgreSQL hỗ trợ một loạt các loại chỉ mục. Chúng thường không loại trừ lẫn nhau. Bạn có thể nghĩ về những điều này như là:

  • Phương pháp chỉ mục (btree, GiST, GIN, v.v.). Chọn một, nếu cần thiết (btree là mặc định)
  • Một phần hoặc đầy đủ. Nếu một phần sử dụng mệnh đề where
  • Trực tiếp hoặc chức năng. Bạn có thể lập chỉ mục đầu ra của các chức năng.
  • Độc đáo hoặc không độc đáo

Tất cả có thể được kết hợp theo nhiều cách khác nhau. Tất cả những gì bạn đang làm ở đây là sử dụng các tính năng duy nhất và một phần, do đó cung cấp cho bạn các chỉ mục duy nhất một phần (cực kỳ hữu ích khi bạn tìm hiểu.

Nhưng giả sử bạn muốn có một chỉ mục không phân biệt chữ hoa chữ thường trên trường tập hợp con trong đó kiểu là đúng. Sau đó, bạn sẽ thêm một định nghĩa chức năng:

CREATE INDEX my_index_name_idx_u ON tbl (lower(subset)) WHERE type;

Lưu ý điều này tạo ra một chỉ mục duy nhất trên đầu ra của hàm low () được gọi trên thuộc tính tập hợp con trong đó kiểu là đúng.


Vì vậy, chỉ số trong câu trả lời của Erwin là trực tiếp, trong khi chỉ số trong ví dụ của bạn về chức năng, có đúng không?
Faheem Mitha

@FaheemMitha: Đúng.
Erwin Brandstetter 24/03/13
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.