2009-02-23 9 views
5

मुझे केवल एक बाधा लागू करने का समाधान चाहिए यदि कोई कॉलम शून्य न हो। मुझे प्रलेखन में ऐसा करने का कोई तरीका नहीं दिख रहा है।पोस्टग्रेस्क्ल में कॉलम शून्य नहीं होने पर मैं केवल बाधा को कैसे लागू कर सकता हूं?

create table mytable(
    table_identifier_a INTEGER, 
    table_identifier_b INTEGER, 
    table_value1,...) 

डेटा की प्रकृति के लिए, तालिका पहचानने पर मुझे पहचानकर्ता बी और एक मान होगा। अतिरिक्त डेटा प्राप्त करने के बाद, मैं पहचानकर्ता को पॉप्युलेट करने में सक्षम हो जाऊंगा। इस बिंदु पर मैं unique key of (identifier_a, value1) सुनिश्चित करना चाहता हूं लेकिन केवल अगर पहचानकर्ता_ए मौजूद है।

उम्मीद है कि समझ में आता है, किसी के पास कोई विचार है?

उत्तर

6

उम्मम। अद्वितीय बाधाएं कई नल मानों को नहीं रोकती हैं।

CREATE TABLE mytable (
    table_identifier_a INTEGER NULL, 
    table_identifier_b INTEGER NOT NULL, 
    table_value1   INTEGER NOT NULL, 

    UNIQUE(table_identifier_a, table_identifier_b) 
); 

ध्यान दें कि हम इस पर ध्यान muliple NULLs सम्मिलित कर सकते हैं, तब भी जब identifier_b मैचों:

test=# INSERT INTO mytable values(NULL, 1, 2); 
INSERT 0 1 
test=# INSERT INTO mytable values(NULL, 1, 2); 
INSERT 0 1 
test=# select * from mytable; 
table_identifier_a | table_identifier_b | table_value1 
--------------------+--------------------+-------------- 
        |     1 |   2 
        |     1 |   2 
(2 rows) 

लेकिन हम नहीं बना सकते डुप्लिकेट (क, ख) जोड़े:

test=# update mytable set table_identifier_a = 3; 
ERROR: duplicate key value violates unique constraint "mytable_table_identifier_a_key" 

बेशक, आपको कोई समस्या है: आपकी तालिका में कोई प्राथमिक कुंजी नहीं है। आप में शायद एक डेटा मॉडल समस्या है। लेकिन आपने इसे ठीक करने के लिए पर्याप्त विवरण प्रदान नहीं किए।

+0

डेटा मॉडल समस्या मेरा नहीं है, इसके ग्राहक :)! धन्यवाद। –

0

आप इसे बाधा के बजाय ट्रिगर का उपयोग करके संभाल सकते हैं।

0

यदि मैं आप थे, तो मैं तालिका को दो तालिकाओं में विभाजित कर दूंगा, और संभावित रूप से दृश्य बना सकता हूं जो उन्हें आवश्यकतानुसार जोड़ता है।

1

यदि यह एक लेन-देन के भीतर पूरे कार्य को पूरा करने से संभव है, यह समय जो postgres बदलना संभव है बाधा, यानी .:

START; 
SET CONSTRAINTS <...> DEFERRED; 
<SOME INSERT/UPDATE/DELETE> 
COMMIT; 

का मूल्यांकन करता है इस मामले में, बाधा प्रतिबद्ध पर मूल्यांकन किया जाता है। देखें: Postgres 7.4 Doc - Set constraints या Postgres 8.3 Doc

1

असल में, मैं शायद इसे दो टेबल में तोड़ दूंगा। आप दो अलग-अलग प्रकार की चीजों का मॉडल कर रहे हैं। पहला प्रारंभिक संस्करण है, जो केवल आंशिक है, और दूसरा पूरी बात है। एक बार जब दूसरी चीज़ को दूसरी चीज़ को लाने के लिए आवश्यक जानकारी हो, तो पंक्ति को एक टेबल से दूसरे में ले जाएं।