2013-01-08 6 views
75

Tôi muốn thiết lập một bảng trong postgresql sao cho hai cột với nhau phải là duy nhất. Có thể có nhiều giá trị của một trong hai giá trị, miễn là không có hai giá trị đó chia sẻ cả hai.Trong Postgresql, Force duy nhất trên sự kết hợp của hai cột

Ví dụ:

CREATE TABLE someTable (
    id int PRIMARY KEY AUTOINCREMENT, 
    col1 int NOT NULL, 
    col2 int NOT NULL 
) 

Vì vậy, col1col2 có thể lặp lại, nhưng không phải cùng một lúc. Vì vậy, điều này sẽ được phép (Không bao gồm id)

1 1 
1 2 
2 1 
2 2 

nhưng không này:

1 1 
1 2 
1 1 -- would reject this insert for violating constraints 

Trả lời

86
CREATE TABLE someTable (
    id serial primary key, 
    col1 int NOT NULL, 
    col2 int NOT NULL, 
    unique (col1, col2) 
) 

autoincrement không phải là postgresql. Bạn muốn có một số serial.

Nếu col1 và col2 làm cho một độc đáo và không thể được null sau đó họ làm cho một khóa chính tốt:

CREATE TABLE someTable (
    col1 int NOT NULL, 
    col2 int NOT NULL, 
    primary key (col1, col2) 
) 
+3

Tôi thích gợi ý của một khóa chính trên duy nhất ở đây, bởi vì chúng tôi không cho phép giá trị NULL trong trường hợp này. Từ các tài liệu PostgeSQL: "Lưu ý rằng một ràng buộc duy nhất không tự cung cấp một mã định danh duy nhất vì nó không loại trừ các giá trị null.)" Https://www.postgresql.org/docs/8.1/static/ddl-constraints .html # AEN2038 – Voles

7

Có vẻ như hạn chế duy nhất thường xuyên :)

CREATE TABLE example (
a integer, 
b integer, 
c integer, 
UNIQUE (a, c)); 

More here

55

Tạo hạn chế duy nhất mà hai số với nhau KHÔNG THỂ nhau được lặp đi lặp lại:

ALTER TABLE someTable 
ADD UNIQUE (col1, col2)