क्या MySQL अद्वितीय बाधाओं पर शून्य मानों को अनदेखा करता है?


289

मेरे पास एक ईमेल कॉलम है जो मैं अद्वितीय होना चाहता हूं। लेकिन मैं यह भी चाहता हूं कि यह अशक्त मूल्यों को स्वीकार करे। क्या मेरे डेटाबेस में 2 शून्य ईमेल हो सकते हैं?


जवाबों:


423

हां, MySQL एक अद्वितीय बाधा के साथ एक कॉलम में कई NULLs की अनुमति देता है।

CREATE TABLE table1 (x INT NULL UNIQUE);
INSERT table1 VALUES (1);
INSERT table1 VALUES (1);   -- Duplicate entry '1' for key 'x'
INSERT table1 VALUES (NULL);
INSERT table1 VALUES (NULL);
SELECT * FROM table1;

परिणाम:

x
NULL
NULL
1

यह सभी डेटाबेस के लिए सही नहीं है। SQL सर्वर 2005 और पुराने, उदाहरण के लिए, केवल एक स्तंभ में एक एकल NULL मान की अनुमति देता है जिसमें एक अद्वितीय बाधा होती है।


37
यह कैसे mysql में सच है, लेकिन सामान्य रूप से जरूरी नहीं है के बारे में उत्कृष्ट टिप्पणी।
user2910265

11
के अनुसार SQLite पूछे जाने वाले प्रश्न , व्यवहार है MySQL, PostgreSQL, SQLite, ओरेकल, और Firebird में एक ही।
अमीर अली अकबरी

4
कृपया अपना उत्तर अपडेट करें। SQLServer 2008+ पूरी तरह से इसके लिए अनुमति देता है, आपको बस WHERE क्लॉज़ जोड़ना होगा ... 2017 में, किसी को भी वैसे भी 2008 के पुराने संस्करण पर नहीं होना चाहिए ... stackoverflow.com/questions/767657/…
मैथ्यू टुरकोटिया

इस छोटे से फीचर का जवाब खोजना बहुत मुश्किल हो गया है, इसके लिए डेटाबेस में नया कॉलम जोड़ने या बहुत पुराने एप्लिकेशन पर MySQL को अपग्रेड करने की आवश्यकता नहीं है। मैं वास्तव में Postgres जैसे समाधान की तलाश में था जहां मैं COALESCE का उपयोग कर सकता हूं लेकिन ऐसा लगता है कि इसका उत्तर हमेशा यह बग नहीं है कि यह कैसे डिज़ाइन किया गया है। यह भी WHERE column IS NOT NULLमुझे विफल नहीं लगता है क्योंकि यह MySQL के मेरे संस्करण में समर्थित नहीं है। किसी को पता है कि मैं कहाँ देख सकता हूँ?
newdark-it

1
ध्यान दें: यह भी अद्वितीय अनुक्रमित काम करता है जिसमें अधिक कॉलम होते हैं। इसलिए यदि आप कॉलम ए, बी और सी अद्वितीय चाहते हैं तो आप अभी भी शून्य, बी, सी के साथ तालिका डबल पंक्तियों में हो सकते हैं
Mihai Crăiță

111

से डॉक्स :

"एक अद्वितीय सूचकांक उन स्तंभों के लिए कई NULL मानों की अनुमति देता है जिनमें NULL हो सकते हैं"

यह सभी इंजनों लेकिन पर लागू होता है BDB


3
BDB अब वर्तमान mysql संस्करणों (5.1.12 से शुरू) पर उपलब्ध नहीं है।
आलिम Alज़दमीर

1
मेरे परीक्षण से पता चलता है कि जावा डर्बी डेटाबेस v10.13.1.1 है। इसी तरह एक अद्वितीय सूचकांक के साथ एक कॉलम में केवल एक नल की अनुमति देता है।
क्रिसिनटाउन

7

मैं अनिश्चित हूं कि क्या लेखक मूल रूप से सिर्फ यह पूछ रहा था कि क्या यह डुप्लिकेट मानों की अनुमति देता है या नहीं या यदि कोई निहित प्रश्न है, तो पूछें, " NULLउपयोग करते समय डुप्लिकेट मानों की अनुमति कैसे दें UNIQUE?" या "केवल एक UNIQUE NULLमूल्य की अनुमति कैसे दें ?"

प्रश्न का उत्तर पहले ही दिया जा चुका है, हाँ अनुक्रमणिका NULLका उपयोग करते समय आपके पास डुप्लिकेट मान हो सकते हैं UNIQUE

चूँकि मैं इस जवाब पर अड़ा रहा कि "एक UNIQUE NULLमूल्य की अनुमति कैसे दी जाए "। किसी और के लिए जो इस सवाल पर ठोकर खा सकता है, जबकि मेरा बाकी जवाब आपके लिए है ...

MySQL में आपके पास एक UNIQUE NULLमान नहीं हो सकता है , हालांकि आपके पास एक UNIQUEखाली स्ट्रिंग के मूल्य के साथ सम्मिलित करके एक खाली मान हो सकता है ।

चेतावनी: संख्यात्मक और स्ट्रिंग के अलावा अन्य प्रकार 0 या किसी अन्य डिफ़ॉल्ट मान के लिए डिफ़ॉल्ट हो सकते हैं।


1
बाधा का सूचकांक से कोई लेना-देना नहीं है। वास्तव में, आप NULL मान के साथ एक भी पंक्ति नहीं रख पाएंगे, इस तथ्य के बावजूद कि ऐसी कोई दूसरी पंक्ति नहीं है।
पीजूस

1
@Pijusn आपका क्या मतलब है "बाधा का सूचकांक से कोई लेना देना नहीं है?" अपने दूसरे वाक्य के बारे में भी, मैंने कभी नहीं कहा कि आपके पास NULL मान के साथ एक पंक्ति हो सकती है, इसीलिए मैंने पोस्ट की शुरुआत में कहा था कि यह केवल एक समाधान है यदि वह शून्य मानों का उपयोग करने पर सेट नहीं है।
Bluegman991

मेरा अभिप्राय यह है कि नए तत्व को जोड़ना UNIQUEबाधा के कारण नहीं, बल्कि बाधा के कारण विफल NOT NULLहोता है। मुझे लगता है कि यह जवाब सवाल के लिए अप्रासंगिक है क्योंकि सवाल विशेष रूप से UNIQUEबाधा के व्यवहार के बारे में है ।
पीजूस

@Pijusn मैं तुम्हें मिल गया। आप सही हैं, मैंने अन्यथा सुझाव देने वाले शब्द को हटा दिया है। मैंने प्रश्न को गलत पढ़ा। लेकिन मेरा मानना ​​है कि उत्तर अभी भी उन उपयोगकर्ताओं के लिए उपयोगी हो सकता है जो इस प्रश्न पर ठोकर खाते हैं, जैसा कि मैंने एक अद्वितीय "कुछ भी नहीं" मूल्य का रास्ता खोजने की कोशिश की, लेकिन गलती से अशक्त होने की अनुमति दे रहा है।
ब्लूमैन 991

1
मुझे यह उत्तर उपयोगी लगा। हालाँकि, इसका उत्तर भी यहाँ दिया गया है । यह पोस्ट मेरी Google खोज से पहला परिणाम था, हालांकि यह उत्तर और जुड़ा हुआ प्रश्न था जो मैं देख रहा था।
किंग्डियन

5

अशक्त अद्वितीय बाधाओं से बचें। आप हमेशा कॉलम को एक नई तालिका में रख सकते हैं, इसे गैर-अशक्त और अद्वितीय बना सकते हैं और फिर उस तालिका को केवल तब ही पॉप्युलेट कर सकते हैं जब आपके पास इसका मूल्य हो। यह सुनिश्चित करता है कि स्तंभ पर किसी भी निर्भरता को सही ढंग से लागू किया जा सकता है और किसी भी समस्या से बचा जा सकता है जो नल के कारण हो सकती है।


6
हां, लेकिन आप जो प्रस्ताव देते हैं वह लगभग वही है जो पहले से ही पर्दे के पीछे mysql करता है। यदि इस कार्यक्षमता में बनाया गया है तो पहिया का फिर से आविष्कार क्यों करें?
प्रोफाइलटाइविस्ट

2
क्योंकि यह SQL मान्य नहीं है। मुझे विश्वास है कि यह टिप उन सभी के लिए उपयोगी होगी जो एक डेटाबेस अज्ञेय डिजाइन चाहते हैं (या आवश्यकता)।
आर्सेन

@ Arsen7 यदि आपके पास कई व्यवसाय हैं - प्रत्येक के साथ कई ग्राहक हैं। आप एक फ़ाइल में अपने ग्राहकों के ईमेल पते के साथ सभी व्यवसाय संग्रहीत करते हैं। तो आप email_address को अद्वितीय नहीं बना सकते क्योंकि विभिन्न व्यवसायों में एक ही क्लाइंट हो सकता है। इसलिए आपको business_id और email_address का एक संयुक्त अद्वितीय सूचकांक बनाना होगा। क्या यह एक नई तालिका में डालना संभव है - जैसा कि समझाया गया है?
गेरहार्ड लिबेनबर्ग 15

4
मेरे पास एक ऐसा मामला है जहां "ईमेल" कॉलम को अद्वितीय या अशक्त होना चाहिए। अगर मुझे आपकी सलाह माननी हो तो मुझे एक एकल "ईमेल" कॉलम के साथ एक नई तालिका बनानी होगी। इस Mysql विशिष्ट व्यवहार पर भरोसा करना बहुत आसान है और परिणाम समान है। ग्राहक को इस बात की परवाह नहीं है कि मैं ईमेल को एक नई तालिका में संग्रहीत करता हूं या नहीं। इसके अलावा, डेटाबेस अज्ञेय डिजाइन सभी अक्सर ओवररेटेड है। बहुत सारी परियोजनाओं के लिए, आप आसानी से बस एक DB से दूसरे में स्विच नहीं कर सकते।
कॉनरेडक्लिनेस्पेल

1
@djmj यकीन है, लेकिन कार्यात्मक निर्भरता ज्यादातर लोगों के लिए महत्वपूर्ण है और अशक्त अद्वितीय बाधा संस्करण BCNF संस्करण के समान निर्भरता को लागू नहीं करता है। तो कौन सा विकल्प अधिक या कम व्यावहारिक है यह निर्भर हो सकता है कि कौन सी निर्भरता आपके लिए महत्वपूर्ण है। इसलिए यह एक नई तालिका बनाने पर विचार करने योग्य है।
nvogel
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.