4 पॉइंट द्वारा GN⁺ 2025-01-11 | 2 टिप्पणियां | WhatsApp पर शेयर करें
  • 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 को एक-दूसरे के बराबर नहीं माना जाता
    • IS operator का उपयोग करके NULL की identity जांची जा सकती है. उदाहरण के लिए, null is null TRUE 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 लगेगा.
    • 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 टिप्पणियां

 
iolothebard 2025-01-14

सभी null अजीब होते हैं।
इसलिए ठीक-ठाक SQL का null ही उल्टा अजीब लगने लगता है…
काने लोगों के देश में दो आंखों वाला ही असामान्य…

 
GN⁺ 2025-01-11
Hacker News राय
  • SQL का NULL Kleene की TRUE-FALSE-UNKNOWN लॉजिक पर आधारित है। NULL को UNKNOWN की तरह पढ़ें तो कई operations ज़्यादा सहज लगते हैं

    • TRUE OR UNKNOWN = TRUE, TRUE AND UNKNOWN = UNKNOWN, UNKNOWN XOR UNKNOWN = UNKNOWN आदि
    • NULL UNKNOWN को दर्शाने वाला placeholder है, और यह नहीं कहा जा सकता कि दो NULL बराबर हैं
    • Postgresql 15 से NULLS NOT DISTINCT का उपयोग करके unique index बनाया जा सकता है
  • जब 1970 के दशक में NULL की अवधारणा लाई गई थी, तब लगा था कि यह भविष्य में बहुत भ्रम पैदा करेगी। 45 साल बाद भी इस पर अब तक चर्चा हो रही है

  • NULL को सहज रूप से समझने का तरीका: किसी table cell में NULL value, 'कोई value नहीं' दिखाने का एक तरीका है। जब unique value चाहिए, तब जिन मामलों में value नहीं है उन्हें गिनती में नहीं लेना चाहिए

  • ORM के उपयोग को लेकर संदेह: ORM सुविधाजनक है, लेकिन इसने ऐसी पीढ़ी पैदा कर दी है जिसने relational database के वास्तव में काम करने का तरीका नहीं सीखा। SQL NULL का व्यवहार बुनियादी relational algebra के अनुरूप है, और समस्या C-style NULL में है

  • Blackadder एपिसोड के संवाद से NULL comparison वाले हास्य की याद आती है

  • Oracle में NULL का empty string के बराबर होना अजीब लगता है

  • object-oriented context में "null" किसी खास property में value न होने को दिखाने में उपयोगी है। JavaScript में null और undefined दोनों हैं; माना जा सकता है कि undefined का मतलब value अज्ञात है और null का मतलब value नहीं है

  • NULL इस अर्थ में अजीब नहीं है कि उसमें duplication नहीं होता। क्योंकि NULL एक-दूसरे के बराबर नहीं होते, इसलिए वे duplicate नहीं हो सकते। अगर NULL semantics पसंद नहीं है, तो sentinel value इस्तेमाल की जा सकती है

  • SQL NULL तब अजीब नहीं लगता जब आप यह सोचते हैं कि जिन records में कुछ values मौजूद नहीं हैं, उनमें relational logic कैसे काम करना चाहिए