ใน Postgresql บังคับเฉพาะกับการรวมกันของสองคอลัมน์


192

ฉันต้องการตั้งค่าตารางใน PostgreSQL ซึ่งทั้งสองคอลัมน์จะต้องไม่ซ้ำกัน สามารถมีได้หลายค่าทั้งสองค่าตราบใดที่ไม่มีสองค่าที่ใช้ร่วมกัน

ตัวอย่างเช่น

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

ดังนั้นcol1และcol2สามารถทำซ้ำได้ แต่ไม่ใช่ในเวลาเดียวกัน ดังนั้นจะได้รับอนุญาต (ไม่รวมรหัส)

1 1
1 2
2 1
2 2

แต่ไม่ใช่:

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

เนื่องจากนี่คือผลการค้นหาอันดับต้น ๆ ใน google อาจจะดีกว่าที่จะให้ตารางการเปลี่ยนแปลงที่มีอยู่ด้วย
ϻαϻɾΣɀО-MaMrEzO

คำตอบ:


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

autoincrementไม่ใช่ postgresql serialคุณต้องการ

หาก col1 และ col2 สร้างความเป็นเอกลักษณ์และไม่สามารถเป็นโมฆะได้พวกเขาจะสร้างคีย์หลักที่ดี:

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

6
ฉันชอบคำแนะนำของคีย์หลักเหนือที่ไม่ซ้ำกันที่นี่เพราะเราไม่อนุญาตให้มีค่า NULL ในกรณีนี้ จากเอกสาร PostgeSQL: "โปรดทราบว่าข้อ จำกัด ที่ไม่ซ้ำกันนั้นไม่ได้ระบุตัวระบุที่ไม่ซ้ำกันเพราะมันไม่ได้ยกเว้นค่า null)" postgresql.org/docs/8.1/static/ddl-constraints.html#AEN2038
ndequeker

ฉันจะใช้สิ่งนี้ในคำจำกัดความของสคีมาได้อย่างไร
wagng

2
ในบางสถานการณ์คุณอาจต้องการให้ใช้คีย์ตัวแทนเป็นคีย์หลักแทนที่จะเป็นชุดของคอลัมน์ โดยเฉพาะอย่างยิ่งเพื่อปรับปรุงประสิทธิภาพเมื่อทำการเชื่อมต่อกับปริมาณข้อมูลขนาดใหญ่ โดยส่วนตัวแล้วฉันไปหาทางออกของ UNIQUE CONSTRAINT ด้านล่าง
Alexis.Rolland

1
เป็นไปได้ไหมที่จะบังคับใช้ข้อ จำกัด ที่ไม่ซ้ำใครในการเปลี่ยนแปลงเพียงครั้งเดียวเช่นไม่ซ้ำกัน (col1, col2 = '1')?
Vikram Khemlani


160

สร้างข้อ จำกัด ที่ไม่ซ้ำกันซึ่งตัวเลขสองตัวร่วมกันไม่สามารถซ้ำกันได้:

ALTER TABLE someTable
ADD UNIQUE (col1, col2)

18

ดูเหมือนว่า UNIQUE CONSTRAINT ปกติ :)

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

เพิ่มเติมที่นี่


1
สิ่งนี้เพิ่มดัชนีสำหรับaและดัชนีสำหรับcอิสระหรือไม่? เพราะฉันต้องการค้นหาอย่างรวดเร็วตามaบางครั้งและค้นหาอย่างรวดเร็วตามcบางครั้ง
CMCDragonkai
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.