Di Postgresql, paksakan unik pada kombinasi dua kolom


192

Saya ingin mengatur tabel di PostgreSQL sedemikian rupa sehingga dua kolom harus unik. Mungkin ada beberapa nilai dari nilai mana pun, asalkan tidak ada dua yang berbagi keduanya.

Misalnya:

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

Jadi, col1dan col2bisa diulang, tapi tidak sekaligus. Jadi, ini akan diizinkan (Tidak termasuk id)

1 1
1 2
2 1
2 2

tapi bukan ini:

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

Karena ini adalah hasil pencarian peringkat teratas di google, Mungkin lebih baik untuk menyediakan tabel alter yang ada juga
ϻαϻɾΣɀО-MaMrEzO

Jawaban:


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

autoincrementbukan postgresql. Anda menginginkan serial.

Jika col1 dan col2 membuat unik dan tidak bisa nol maka mereka membuat kunci utama yang baik:

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

6
Saya suka saran kunci primer lebih dari unik di sini, karena kami tidak mengizinkan nilai NULL dalam kasus ini. Dari docs PostgeSQL: "Perhatikan bahwa kendala yang unik tidak, dengan sendirinya, memberikan pengenal unik karena tidak mengecualikan nilai null)." Postgresql.org/docs/8.1/static/ddl-constraints.html#AEN2038
ndequeker

Bagaimana saya bisa menerapkan ini dalam definisi skema?
wagng

2
Dalam beberapa skenario, Anda mungkin menginginkan kunci pengganti untuk digunakan sebagai kunci utama daripada kombinasi kolom. Khususnya untuk meningkatkan kinerja ketika melakukan penggabungan pada volume data besar. Saya pribadi mencari solusi CONSTRAINT UNIK di bawah ini.
Alexis.Rolland

1
Apakah mungkin untuk menegakkan batasan unik hanya pada satu permutasi, seperti unik (col1, col2 = '1')?
Vikram Khemlani


160

Buat batasan unik yang dua angka bersama TIDAK BISA diulang:

ALTER TABLE someTable
ADD UNIQUE (col1, col2)

18

Sepertinya KONSTRA UNIK biasa :)

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

Lebih lanjut di sini


1
Apakah ini menambahkan indeks untuk adan indeks untuk csecara mandiri? Karena saya perlu mencari berdasarkan akadang-kadang, dan kadang-kadang menemukan berdasarkan c.
CMCDragonkai
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.