TATECHATLAS
◎ हिन्दी
डेटा और डेटाबेस

गलत पंक्तियाँ खोए बिना PostgreSQL विदेशी कुंजी हटाने की नीति चुनें

RESTRICT, CASCADE और SET NULL की तुलना एक छोटे अलग उदाहरण से करें, फिर वास्तविक डेटा बदलने से पहले वास्तविक बाधा और निर्भर पंक्तियाँ जाँचें।

इस पृष्ठ पर

बच्चे की पंक्ति क्या दर्शाती है, इसके अनुसार ON DELETE चुनें। RESTRICT संदर्भित मूल को हटाने से रोकता है; CASCADE मिलान करने वाली बच्ची पंक्तियाँ हटा देता है; SET NULL बच्चों को बनाए रखता है और उनके विदेशी कुंजी मान को साफ़ कर देता है। ये क्रियाएँ विदेशी कुंजी बाधा पर परिभाषित होती हैं, DELETE कथन में CASCADE या SET NULL जोड़कर नहीं।

एक अलग उदाहरण का अनुसरण करें

यह चित्रण स्क्रिप्ट तीन अलग-अलग बच्ची तालिकाओं और तीन अलग-अलग मूल पंक्तियों का उपयोग करती है ताकि नीतियाँ स्वतंत्र रहें। यह एक ही संबंध पर तीन टकराव वाली नीतियाँ नहीं जोड़ती। ऐसे प्रदर्शन केवल एक अस्थायी सत्र में चलाएँ; लेनदेन ROLLBACK के साथ समाप्त होता है और यह आपकी उत्पादन स्कीमा का परीक्षण करने का दावा नहीं करता।

तय करें कि क्या बच्ची स्वतंत्र अस्तित्व में रह सकती है

एक विवरण पंक्ति जिसका अपने मूल के बिना कोई अर्थ नहीं है, वह कैस्केड हटाने के लिए उपयुक्त हो सकती है। एक ऐतिहासिक रिकॉर्ड जिसे बनाए रखना आवश्यक है, वह हटाने को प्रतिबंधित करने या एक वैकल्पिक संबंध के साथ पंक्ति को बनाए रखने की माँग कर सकता है। उस व्यावसायिक निर्णय के साथ शुरू करें, न कि उस क्रिया को चुनकर जो विफल DELETE को सफल बना दे।

एक विदेशी कुंजी अपनी बाधा में घोषित संबंध की रक्षा करती है। यह स्वयं एक धारणा नीति लागू नहीं करती, व्यक्तिगत डेटा हटाने की अनुमति नहीं लेती, और रिकॉर्ड से जुड़े बाहरी फ़ाइलों को सुरक्षित नहीं रखती।

वास्तव में लागू होने वाली बाधा का निरीक्षण करें

डेटाबेस स्कीमा या प्रशासनिक उपकरण में संदर्भित तालिका, संदर्भित कॉलम और कॉन्फ़िगर की गई ON DELETE क्रिया खोजें। किसी कॉलम के नाम या ORM मॉडल से क्रिया का अनुमान न लगाएँ, क्योंकि वे तैनात डेटाबेस से मेल नहीं खा सकते।

CASCADE और SET NULL विदेशी कुंजी परिभाषा में REFERENCES खंड के बाद आते हैं। DELETE FROM parent WHERE id = 1 CASCADE जैसा कमांड PostgreSQL में विदेशी कुंजी क्रिया चुनने के लिए DELETE सिंटैक्स नहीं है।

तीन क्रियाओं की तुलना करें

RESTRICT के साथ, एक मूल को हटाने का प्रयास जिसका अभी भी कोई बच्चा संदर्भित करता है, अस्वीकृत कर दिया जाता है। CASCADE के साथ, मूल को हटाने पर संदर्भित बच्चे हटा दिए जाते हैं। SET NULL के साथ, बच्चे बने रहते हैं लेकिन उनके संदर्भित कॉलम शून्य हो जाते हैं। अन्य बाधाएँ अभी भी लागू होती हैं और ऑपरेशन को रोक सकती हैं।

SET NULL तभी उपयुक्त है जब प्रभावित कॉलम और अनुप्रयोग तर्क शून्य को स्वीकार करते हों। एक NOT NULL बाधा हटाने को विफल कर सकती है। NO ACTION एक अन्य नीति है, लेकिन इसे हर स्थिति में RESTRICT के समान नहीं बताना चाहिए: स्थगित बाधा जाँच के कारण यह अंतर महत्वपूर्ण हो सकता है।

BEGIN;
CREATE TEMP TABLE demo_parent (id integer PRIMARY KEY);
CREATE TEMP TABLE demo_restrict (
    id integer PRIMARY KEY,
    parent_id integer REFERENCES demo_parent(id) ON DELETE RESTRICT
);
CREATE TEMP TABLE demo_cascade (
    id integer PRIMARY KEY,
    parent_id integer REFERENCES demo_parent(id) ON DELETE CASCADE
);
CREATE TEMP TABLE demo_null (
    id integer PRIMARY KEY,
    parent_id integer REFERENCES demo_parent(id) ON DELETE SET NULL
);
INSERT INTO demo_parent VALUES (1), (2), (3);
INSERT INTO demo_restrict VALUES (10, 1);
INSERT INTO demo_cascade VALUES (20, 2);
INSERT INTO demo_null VALUES (30, 3);
DELETE FROM demo_parent WHERE id IN (2, 3);
SELECT count(*) AS remaining_cascade_rows FROM demo_cascade;
SELECT id, parent_id FROM demo_null ORDER BY id;
ROLLBACK;

अपेक्षित परिणाम और अस्वीकृत स्थिति को समझें

अपेक्षित कैस्केड गिनती शून्य है क्योंकि parent 2 से जुड़ा child हटा दिया गया है। id 30 वाली पंक्ति demo_null में parent_id के साथ null के बराबर रहती है। स्क्रिप्ट parent 1 को हटाती नहीं, इसलिए उसका restrict child बना रहता है। ये परिणाम बताई गई सीमाओं और नमूना डेटा से निकलते हैं; ये माप नहीं, केवल चित्रण हैं।

rollback से पहले parent 1 को हटाने का प्रयास अस्वीकृत हो जाएगा क्योंकि demo_restrict अभी भी इसका संदर्भ दे रहा है। उस जानबूझकर विफल होने वाले कथन को स्क्रिप्ट से छोड़ दिया गया है: एक त्रुटि लेनदेन को रोक सकती है, और बाद के SQL को उचित rollback संभाल की आवश्यकता होती है।

वास्तविक हटाने से पहले क्षेत्र की जाँच करें

प्रस्तावित parent शर्त से मेल खाने वाली पंक्तियों की गिनती करें और निर्भर तालिकाओं की जाँच करें। कैस्केड आगे के संबंधों से होकर बढ़ सकते हैं और एक ही बच्चे तालिका गिनती से कहीं अधिक पंक्तियाँ हटा सकते हैं। पूरी निर्भरता श्रृंखला और ऐप्लिकेशन परिणामों की समीक्षा करें।

एक पूर्वावलोकन क्वेरी और बाद का DELETE स्वचालित रूप से समवर्ती बदलावों के अंतर्गत एक सुरक्षित परमाणु निर्णय नहीं होते। वास्तविक संचालन के लिए आवश्यक लेनदेन और लॉकिंग व्यवहार की योजना बनाएं, बजाय इसके कि मान लें कि पहले की गिनती डेटा को ही जमा देती है।

गारंटीकृत गति का दावा किए बिना प्रदर्शन की जाँच करें

किसी संदर्भित पंक्ति को हटाने के लिए संदर्भित पक्ष पर पंक्तियाँ खोजने की आवश्यकता हो सकती है। PostgreSQL केवल विदेशी कुंजी घोषित करने के कारण संदर्भित विदेशी कुंजी स्तंभों पर स्वचालित रूप से कोई अनुक्रमण नहीं बनाता। किसी अन्य अनुक्रमण की उपयुक्तता तय करने से पहले मौजूद अनुक्रमणों और कार्यभार की जाँच करें।

बड़े कैस्केड लॉक रख सकते हैं, महत्वपूर्ण डेटाबेस कार्य पैदा कर सकते हैं और समवर्ती उपयोगकर्ताओं को प्रभावित कर सकते हैं। उचित रखरखाव प्रक्रिया और पुनर्प्राप्ति योजना का प्रयोग करें। छोटा अस्थायी तालिका उदाहरण व्यवहार स्थापित करता है, उत्पादन हटाने की लागत नहीं।

संबंधी क्रियाओं को ऐप्लिकेशन सफाई से अलग रखें

डेटाबेस सीमाएँ घोषित डेटाबेस संबंधों पर कार्य करती हैं। वे लेनदेन के बाहर बनाए रखे गए फाइलों, दूरस्थ सेवाओं या घटनाओं की सफाई की गारंटी नहीं देतीं। उन पार्श्व प्रभावों को स्पष्ट रूप से ध्यान में रखें।

rollback उदाहरण में लेनदेन डेटाबेस बदलावों की रक्षा करता है, बाहरी प्रणालियों द्वारा किए गए मनमाने क्रियाओं की नहीं। यदि तैनात नीति गलत है, तो उसे बदलने को एक जाँचे गए स्कीमा बदलाव के रूप में देखें, एक विफल अनुरोध के लिए त्वरित उपाय नहीं।

क्या जाँचें

  • ON DELETE वास्तविक विदेशी कुंजी परिभाषा में जाँचा जाता है।
  • SET NULL के लिए संभावित कॉलम उपयुक्त होने चाहिए।
  • निर्भर पंक्तियाँ और आगे की कैस्केड संबंध समझे जाते हैं।
  • एक सैंडबॉक्स उदाहरण उत्पादन हटाने और पुनर्प्राप्ति प्रक्रियाओं से अलग होता है।

उदाहरण PostgreSQL और सरल एकल-कॉलम विदेशी कुंजियों का उपयोग करते हैं। संयुक्त कुंजियाँ, स्थगित बाधाएँ, विभाजन, ट्रिगर और अनुप्रयोग पक्ष प्रभाव अतिरिक्त विश्लेषण माँग सकते हैं। कोई उत्पादन निष्पादन या प्रदर्शन परिणाम दावा नहीं किया गया है।

स्रोत

  1. PostgreSQL: constraints ↗
  2. PostgreSQL: DELETE ↗
ऊपर जाएँ ↑