PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

समग्र प्राथमिक कुंजी शामिल स्तंभों पर नल बाधाओं को लागू नहीं करती है

अगर आपको जरूरत NULL मानों को अनुमति देने के लिए, UNIQUE . का उपयोग करें बाधा PRIMARY KEY . के बजाय (और एक सरोगेट पीके कॉलम जोड़ें, मैं एक serial . सुझाता हूं ) यह कॉलम को NULL होने देता है:

CREATE TABLE distributor (
   distributor_id serial PRIMARY KEY
 , m_id integer
 , x_id integer
 , UNIQUE(m_id, x_id)
);

नोट , हालांकि (प्रति दस्तावेज़):

<ब्लॉकक्वॉट>

एक अद्वितीय बाधा के प्रयोजन के लिए, शून्य मानों को समान नहीं माना जाता है।

आपके मामले में, आप कुछ इस तरह दर्ज कर सकते हैं (1, NULL) (m_id, x_id) . के लिए बाधा का उल्लंघन किए बिना कितनी बार। पोस्टग्रेज कभी भी दो NULL मानों को बराबर नहीं मानता है - SQL मानक में परिभाषा के अनुसार।

अगर आपको NULL . का इलाज करने की आवश्यकता है ऐसे "डुप्लिकेट" को अस्वीकार करने के बराबर मान, मुझे दो विकल्प दिखाई देते हैं :

<एच4>1. दो आंशिक अनुक्रमणिका

इसके अलावा UNIQUE . के लिए ऊपर की बाधा:

CREATE UNIQUE INDEX dist_m_uni_idx ON distributor (m_id) WHERE x_id IS NULL;
CREATE UNIQUE INDEX dist_x_uni_idx ON distributor (x_id) WHERE m_id IS NULL;

लेकिन यह दो से अधिक स्तंभों के साथ जल्दी से हाथ से निकल जाता है जो NULL हो सकते हैं। देखें:

  • अशक्त स्तंभों के साथ अद्वितीय बाधा बनाएं
<एच4>2. एक बहु-स्तंभ UNIQUE भावों पर अनुक्रमणिका

अद्वितीय बाधा के बजाय। हमें एक मुफ्त डिफ़ॉल्ट मान की आवश्यकता है जो शामिल कॉलम में कभी मौजूद नहीं है, जैसे -1 . CHECK जोड़ें इसे अस्वीकार करने के लिए बाधाएं:

CREATE TABLE distributor (
   distributor serial PRIMARY KEY
 , m_id integer
 , x_id integer
 , CHECK (m_id &lt> -1)
 , CHECK (x_id &lt> -1)
);
CREATE UNIQUE INDEX distributor_uni_idx ON distributor (COALESCE(m_id, -1)
                                                      , COALESCE(x_id, -1))

निश्चित रूप से RDBMS चीजों को कैसे संभालता है हमेशा उचित व्यवहार के लिए एक उपयोगी संकेतक नहीं होता है। पोस्टग्रेज मैनुअल इस पर संकेत देता है:

<ब्लॉकक्वॉट>

इसका मतलब है कि एक अद्वितीय बाधा की उपस्थिति में भी डुप्लिकेट पंक्तियों को संग्रहीत करना संभव है, जिसमें कम से कम एक विवश कॉलम में एक शून्य मान होता है। यह व्यवहार SQL मानक के अनुरूप है, लेकिन हमने सुना है कि अन्य SQL डेटाबेस इस नियम का पालन नहीं कर सकते हैं इसलिए पोर्टेबल होने के लिए डिज़ाइन किए गए एप्लिकेशन विकसित करते समय सावधान रहें।

बोल्ड जोर मेरा।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. JSON प्रकार के अंदर सरणी तत्वों के लिए क्वेरी

  2. त्रुटि:Postgres . का उपयोग करके अनुक्रम शहरों_id_seq के लिए अनुमति अस्वीकृत

  3. पोस्टग्रेज:समग्र कुंजी कैसे करें?

  4. PostgreSQL और Redshift में सबस्ट्रिंग फ़ंक्शन का उपयोग कैसे करें

  5. Psql (PostgreSQL) में क्वेरी चलाते समय शून्य मान कैसे दिखाएं