2011-10-13 15 views
6

मैं postgres पर इस तरह की पंक्तियों:व्यर्थ मान अद्वितीय नहीं है

name | address | college 

john | rome | 
john | rome | 
max | tokyo | 

मैं इस तरह एक तालिका बनाने:

create test (
name varchar(10), 
address varchar(20), 
college varchar(20), 
constraint test_uq unique (name,address,college); 

मैं शून्य मान अद्वितीय बन कैसे कर सकते हैं, तो उत्पादन इस तरह हो सकता है:

name | address | college 

john | rome | 
max | tokyo | 
+0

MySQL और गैर-अद्वितीय नल के बारे में संबंधित प्रश्न: http://stackoverflow.com/qu estions/4081783/अद्वितीय-कुंजी-साथ-नल – osa

उत्तर

2

Postgres प्रलेखन claims है कि इस व्यवहार SQL मानक के अनुरूप है:

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

एक संभावना यह अपने स्कीमा पर पुनर्विचार करने की है (ईमानदार होना, name+address+college पर एक विशिष्टता बाधा अपने उदाहरण में अर्थ की एक पूरी बहुत नहीं है)।

+0

ओह मेरे..so शून्य मूल्य अद्वितीय नहीं है? तो अनावश्यक डेटा से कैसे बचें? मेरी असली तालिका में, मैं तालिका में रिकॉर्ड डालता हूं, जिसमें उस तालिका में अद्वितीय बाधा सच होती है, फिर मैं एक ही रिकॉर्ड फिर से डालता हूं, और उसी रिकॉर्ड को तालिका में डाला जाता है, अंततः उस तालिका में 2 समान रिकॉर्ड होता है :( –

0

यदि आप इसे एक अद्वितीय बाधा के बजाय प्राथमिक कुंजी बनाते हैं, तो यह काम करेगा। इसके लिए, कॉलम collegeNOT NULL होना चाहिए और नल मानों के बजाय रिक्त तारों का उपयोग करें (उदाहरण के लिए)। या आप एक प्रश्न के लिए देख रहे हैं?

+0

मैं इसे प्राथमिक कुंजी नहीं बना सकता, क्योंकि मेरे वास्तविक डेटा में, कुछ रिकॉर्डों का मान होता है, –

+0

यह ठीक है - भले ही कुछ रिकॉर्डों का मान हो। आप चाहते हैं कि 2 रिकॉर्डों में समान (नाम, पता, कॉलेज) मूल्य न हो, सही? –

+0

हाँ सही, नाम, पता, कॉलेज –

0

NULL अज्ञात है इसलिए NULL के बराबर न्यूल का मान कभी भी सत्य नहीं हो सकता है। इस कानून के आसपास काम करने के लिए यह करो।

अपने कॉलेजों के लिए एक नई लुक-अप तालिका बनाएं। उस तालिका में मूल्य के साथ कोई रिकॉर्ड नहीं है। फिर नई कॉलेज लुकअप टेबल पर एक विदेशी कुंजी डालें।

यह छद्म कोड है ताकि आपको इसे काम करने के लिए इसके साथ गड़बड़ होनी पड़े, लेकिन यहां मूल विचार है।

CREATE TABLE college(college_id SERIAL PRIMARY KEY,college_type); 
INSERT INTO college(college_type) 
SELECT 1,None; 


create test (
name varchar(10), 
address varchar(20), 
college_id INTEGER NOT NULL DEFAULT 1, 
constraint test_uq unique (name,address,college_id); 
+0

hmm मैं इसे 2 टेबल बनना नहीं चाहता, क्योंकि मेरे वास्तविक डेटा में, मुझे इसे 1 टेबल बनाना है, क्योंकि मेरे डेटा का उद्देश्य सारांश_रपोर्ट है। लेकिन आपके उत्तर के लिए धन्यवाद। मैं इसे स्वीकार करता हूं। बहुत धन्यवाद –

+0

आप अभी भी जो भी कह रहे थे वह कर सकते हैं लेकिन नई टेबल छोड़ दें और इसके बजाय अपने मौजूदा कॉलेज टेबल में एनओएलएलई या एनए – Kuberchaun

+0

के साथ एनयूएलएल को प्रतिस्थापित करें, इसलिए मैं कॉलेज के लिए डिफ़ॉल्ट मान देता हूं, फिर कॉलेज की बाधा को शून्य नहीं देता? –

2

तुम सिर्फ SELECT DISTINCT

 
postgres=# SELECT * FROM test; 
name | address | college 
------+---------+--------- 
john | rome | 
john | rome | 
max | tokyo | 
(3 rows) 

postgres=# SELECT DISTINCT * FROM test; 
name | address | college 
------+---------+--------- 
john | rome | 
max | tokyo | 
(2 rows) 

का उपयोग आप शून्य मान अनदेखी अनन्य रिकॉर्ड को लागू करना चाहते हैं क्वेरी परिणाम में अद्वितीय रिकॉर्ड की जरूरत है आप एक conditional unique index

 
postgres=# CREATE UNIQUE INDEX test_index ON test (name, address) WHERE college IS NULL; 
CREATE INDEX 
postgres=# INSERT INTO test (name, address) VALUES ('john', 'rome'); 
INSERT 0 1 
postgres=# INSERT INTO test (name, address) VALUES ('max', 'tokyo'); 
INSERT 0 1 
postgres=# INSERT INTO test (name, address, college) VALUES ('john', 'rome', 'college'); 
INSERT 0 1 
postgres=# INSERT INTO test (name, address) VALUES ('john', 'rome'); 
ERROR: duplicate key value violates unique constraint "test_index" 
DETAIL: Key (name, address)=(john, rome) already exists. 

HTH

बनाना होगा
संबंधित मुद्दे