Postgresql में, दो स्तंभों के संयोजन पर अद्वितीय बल


188

मैं 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

के रूप में यह गूगल में एक शीर्ष रैंक खोज परिणाम है, शायद बेहतर मौजूद तालिका प्रदान करने के लिए बेहतर है
aαϻɾΣɀО-MaMrEzO

जवाबों:


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

autoincrementpostgresql नहीं है। तुम एक चाहते हैं serial

यदि col1 और col2 एक अद्वितीय बनाते हैं और अशक्त नहीं हो सकते हैं तो वे एक अच्छी प्राथमिक कुंजी बनाते हैं:

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

5
मुझे यहां अद्वितीय पर एक प्राथमिक कुंजी का सुझाव पसंद है, क्योंकि हम इस मामले में NULL मान की अनुमति नहीं देते हैं। PostgeSQL डॉक्स से: "ध्यान दें कि एक अद्वितीय बाधा अपने आप से नहीं है, एक अद्वितीय पहचानकर्ता प्रदान करता है क्योंकि यह शून्य मानों को बाहर नहीं करता है।)" postgresql.org/docs/8.1/static/ddl-constraints.html#AEN2038
ndequekerer।

मैं इसे स्कीमा परिभाषा में कैसे लागू कर सकता हूं?
wagng

2
कुछ परिदृश्यों में आप कॉलम के संयोजन के बजाय एक सरोगेट कुंजी को प्राथमिक कुंजी के रूप में उपयोग करना चाहते हैं। विशेष रूप से प्रदर्शन में सुधार करने के लिए जब बड़े डेटा वॉल्यूम पर जुड़ते हैं। मैं व्यक्तिगत रूप से UNIQUE CONSTRAINT समाधान के लिए नीचे गया था।
एलेक्सिस। रोलैंड

1
क्या केवल एक क्रमपरिवर्तन पर एक अद्वितीय बाधा को लागू करना संभव है, जैसे कि अद्वितीय (col1, col2 = '1')?
विक्रम खेमलानी


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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.