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
PearsonArtPhoto
sumber
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)
)
Clodoaldo Neto
sumber
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)
djangojazz
sumber
18

Sepertinya KONSTRA UNIK biasa :)

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

Lebih lanjut di sini

Timur Sadykov
sumber
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