2012-06-13 8 views
7

Tôi muốn tìm cách lưu trữ nhiều địa chỉ cho một chủ đề trong cơ sở dữ liệu của mình, chỉ với một địa chỉ mặc định cho mỗi chủ đề.Postgres Ràng buộc duy nhất trên hai cột: Số nguyên và Boolean

Để cắt một câu chuyện dài ngắn, cho phép nói rằng chúng ta có một bảng:

CREATE TABLE test 
(
    id integer NOT NULL, 
    active boolean NOT NULL, 
    CONSTRAINT pk_id PRIMARY KEY (id) 
) 

Đối với mỗi id trong bảng, phải có ít nhất 1 đúng giá trị tích cực.

Làm cách nào để đạt được điều này?

Cảm ơn.

+0

Thực ra bạn không phải làm gì cả * vì 'id' là khóa chính làm cho nó độc đáo nên * không thể * là hai hàng có cùng ID. – ThiefMaster

+0

Nếu bạn không muốn 'id' làm primary thì bạn sẽ cần phải viết một trigger: http://www.postgresql.org/docs/9.1/static/sql-createtrigger.html nhưng đó không phải là thứ bạn muốn. –

Trả lời

11

Partial index là những gì bạn muốn:

create unique index some_index on test (id) where active; 

Như @ThiefMaster khẳng định chỉ số chính cần được loại bỏ.

+0

Cảm ơn. Điều đó là tốt vì PK của tôi là địa chỉ PK trong bảng này. Điều này cũng hoạt động: CREATE UNIQUE INDEX some_index ON kiểm tra SỬ DỤNG btree (hoạt động, id) WHERE active; – greatkalu

+0

Bạn sẽ nhận thấy rằng điều duy nhất bạn thực sự thay đổi trong truy vấn của mình là thêm hoạt động vào chỉ mục. Trong khi hoạt động luôn luôn đúng cho tất cả các lĩnh vực mà một chủ đề cho chỉ mục bạn chỉ cần thêm một số sưng lên. – kworr

+1

PK chỉ là tổng hợp các ràng buộc UNIQUE và NOT NULL. – kworr

3

Trong trường hợp này Câu hỏi không cần thiết như đã giải thích trước đây.

Nhưng FYI, bạn có thể đặt ràng buộc thành 2 hoặc nhiều hơn (không phải khóa chính) cột với các loại khác nhau. Ví dụ:

ALTER TABLE table_name ADD CONSTRAINT constraint_name UNIQUE (integer_column, boolean_column); 

cho biết thêm, xem Postgres doc cho Constraints, các "ràng buộc Unique" phần. Trích dẫn:

Nếu một hạn chế duy nhất dùng để chỉ một nhóm các cột, các cột được liệt kê cách nhau bởi dấu phẩy ...

này quy định rằng sự kết hợp của các giá trị trong các cột chỉ là duy nhất trên toàn bộ bảng, mặc dù bất kỳ một trong các cột không cần phải (và thông thường là không) duy nhất.

Lưu ý: Một partial index đặt một chỉ số được xây dựng trên một tập hợp con của một bảng, trong đó có một mục đích hoàn toàn khác nhau.

+0

Tôi nghĩ với giải pháp của bạn, anh ta không thể có nhiều địa chỉ không hoạt động. – Hossein