Trong Postgresql, buộc duy nhất kết hợp hai cột


187

Tôi muốn thiết lập một bảng trong PostgreSQL sao cho hai cột cùng nhau 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.

Ví dụ:

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

Vì vậy, col1col2có 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 cho phép (Không bao gồm id)

1 1
1 2
2 1
2 2

nhưng không phải cái này:

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

Vì đây là kết quả tìm kiếm xếp hạng hàng đầu trong google, Có lẽ tốt hơn là cung cấp bảng thay đổi tồn tại
ϻαϻɾΣɀ602-MaMrEzO

Câu trả lời:


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

autoincrementkhông phải là postgresql. Bạn muốn một serial.

Nếu col1 và col2 tạo ra một duy nhất và không thể rỗng thì chúng tạo một khóa chính tốt:

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

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

Làm thế nào tôi có thể thực hiện điều này trong định nghĩa lược đồ?
wagng

2
Trong một số trường hợp, bạn có thể muốn sử dụng khóa thay thế làm khóa chính thay vì kết hợp các cột. Đặc biệt để cải thiện hiệu suất khi thực hiện tham gia vào khối lượng dữ liệu lớn. Cá nhân tôi đã đi cho giải pháp UNIQUE CONSTRAINT dưới đây.
Alexis.Rolland

1
Có thể thực thi một ràng buộc duy nhất trên chỉ một hoán vị, chẳng hạn như duy nhất (col1, col2 = '1') không?
Vikram Khemlani


160

Tạo ràng buộc duy nhất mà hai số cùng nhau KHÔNG THỂ lặp lại:

ALTER TABLE someTable
ADD UNIQUE (col1, col2)

18

Có vẻ như CONSTRAINT UNIITE thông thường :)

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

Thêm ở đây


1
Điều này có thêm một chỉ mục cho avà một chỉ mục cho cđộc lập? Bởi vì tôi cần phải nhanh chóng tìm thấy dựa trên ađôi khi, và nhanh chóng tìm thấy dựa trên cđôi khi.
CMCDragonkai
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.