SQL में NULL अजीब है
(jirevwe.github.io)-
SQL में NULL values को एक अनोखे तरीके से handle किया जाता है. UNIQUE constraint वाले column में कई NULL values हो सकती हैं.
- ऐसा इसलिए है क्योंकि हर NULL value को दूसरे NULL से अलग, स्वतंत्र value माना जाता है
- SQLite, Postgres, और MySQL सभी में यही behavior है.
-
मानक तय करना
select '' = ''; -- Returns 1 (true) empty string बराबर है select 1 = 1; -- Returns 1 (true) number बराबर हैं select 1 = 0; -- Returns 0 (false) numbers अलग हैं select null = null; -- Returns NULL (null) हाँ?- NULL एक "unknown value" को दिखाने वाला placeholder है, इसलिए दो unknown values को एक-दूसरे के बराबर नहीं माना जाता
ISoperator का उपयोग करके NULL की identity जांची जा सकती है. उदाहरण के लिए,null is nullTRUE return करता है.
-
uniqueness के बारे में
- अगर UNIQUE constraint वाले column में NULL values हों, तो NULL values को एक-दूसरे से अलग माना जाता है, इसलिए वे uniqueness constraint का उल्लंघन नहीं करतीं.
- उदाहरण के लिए,
('ray@mail.com', NULL)और('ray@mail.com', NULL)को अलग rows माना जाता है.
-
NULL को ऐसे handle करने की वजह
- SQLite और दूसरे SQL-compatible databases में NULL को इस तरह implement किया गया है ताकि दूसरे databases के साथ consistent behavior रखा जा सके. SQL standard documents सुझाव देते हैं कि NULL हर जगह unique होना चाहिए, लेकिन व्यवहार में ज़्यादातर SQL engines SELECT DISTINCT या UNION में NULL को unique तरीके से handle नहीं करते.
-
uniqueness सुनिश्चित करने के तरीके
-
generated column का उपयोग
- एक ऐसा column बनाकर, जिसमें हमेशा non-NULL deterministic value हो, इस समस्या को कम किया जा सकता है. उदाहरण के लिए, NULL values को बदलने के लिए
COALESCE(deleted_at, '1970-01-01')इस्तेमाल किया जा सकता है. - इस तरीके में table में एक अतिरिक्त field जुड़ सकती है, जिससे space लगेगा.
- एक ऐसा column बनाकर, जिसमें हमेशा non-NULL deterministic value हो, इस समस्या को कम किया जा सकता है. उदाहरण के लिए, NULL values को बदलने के लिए
-
partial index का उपयोग
deleted_atके NULL होने पर हीemailपर partial index बनाकर uniqueness सुनिश्चित की जा सकती है.- partial index table को चौड़ा नहीं करते, कम space लेते हैं, और एक ही record pair को बार-बार delete करने पर error भी नहीं आती.
-
-
अपडेट
- Oracle empty string को NULL की तरह treat करता है.
-
निष्कर्ष
- ORM इस्तेमाल करते समय यह दिखता नहीं है, लेकिन SQL NULL का यह अनोखा handling तरीका भ्रम पैदा कर सकता है. SQL standard documents सार्वजनिक रूप से उपलब्ध नहीं हैं, और उन्हें पाने के लिए भुगतान करना पड़ता है.
2 टिप्पणियां
सभी null अजीब होते हैं।
इसलिए ठीक-ठाक SQL का null ही उल्टा अजीब लगने लगता है…
काने लोगों के देश में दो आंखों वाला ही असामान्य…
Hacker News राय
SQL का
NULLKleene की TRUE-FALSE-UNKNOWN लॉजिक पर आधारित है।NULLको UNKNOWN की तरह पढ़ें तो कई operations ज़्यादा सहज लगते हैंNULLUNKNOWN को दर्शाने वाला placeholder है, और यह नहीं कहा जा सकता कि दोNULLबराबर हैंNULLS NOT DISTINCTका उपयोग करके unique index बनाया जा सकता हैजब 1970 के दशक में
NULLकी अवधारणा लाई गई थी, तब लगा था कि यह भविष्य में बहुत भ्रम पैदा करेगी। 45 साल बाद भी इस पर अब तक चर्चा हो रही हैNULLको सहज रूप से समझने का तरीका: किसी table cell मेंNULLvalue, 'कोई value नहीं' दिखाने का एक तरीका है। जब unique value चाहिए, तब जिन मामलों में value नहीं है उन्हें गिनती में नहीं लेना चाहिएORM के उपयोग को लेकर संदेह: ORM सुविधाजनक है, लेकिन इसने ऐसी पीढ़ी पैदा कर दी है जिसने relational database के वास्तव में काम करने का तरीका नहीं सीखा। SQL
NULLका व्यवहार बुनियादी relational algebra के अनुरूप है, और समस्या C-styleNULLमें हैBlackadder एपिसोड के संवाद से
NULLcomparison वाले हास्य की याद आती हैOracle में
NULLका empty string के बराबर होना अजीब लगता हैobject-oriented context में "null" किसी खास property में value न होने को दिखाने में उपयोगी है। JavaScript में
nullऔरundefinedदोनों हैं; माना जा सकता है किundefinedका मतलब value अज्ञात है औरnullका मतलब value नहीं हैNULLइस अर्थ में अजीब नहीं है कि उसमें duplication नहीं होता। क्योंकिNULLएक-दूसरे के बराबर नहीं होते, इसलिए वे duplicate नहीं हो सकते। अगरNULLsemantics पसंद नहीं है, तो sentinel value इस्तेमाल की जा सकती हैSQL
NULLतब अजीब नहीं लगता जब आप यह सोचते हैं कि जिन records में कुछ values मौजूद नहीं हैं, उनमें relational logic कैसे काम करना चाहिए