"अपडेट केस" का उपयोग कब करें


420

मैं नियमित रूप से "ON DELETE CASCADE" का उपयोग करता हूं, लेकिन मैं कभी भी "ON UPDATE CASCADE" का उपयोग नहीं करता हूं क्योंकि मुझे यकीन नहीं है कि यह किस स्थिति में उपयोगी होगा।

चर्चा के लिए कुछ कोड देखें।

CREATE TABLE parent (
    id INT NOT NULL AUTO_INCREMENT,
    PRIMARY KEY (id)
);

CREATE TABLE child (
    id INT NOT NULL AUTO_INCREMENT, parent_id INT,
    INDEX par_ind (parent_id),
    FOREIGN KEY (parent_id)
        REFERENCES parent(id)
        ON DELETE CASCADE
);

"DELETE CASCADE" के लिए, यदि अभिभावक idको हटा दिया जाता है, तो बच्चे के साथ एक रिकॉर्ड parent_id = parent.idस्वतः ही हटा दिया जाएगा। यह कोई समस्या नहीं होनी चाहिए।

  1. इसका अर्थ है कि "ON UPDATE CASCADE" idमाता-पिता के अपडेट होने पर वही काम करेगा ?

  2. यदि (1) सही है, तो इसका मतलब है कि "अपडेट कैस्केड" का उपयोग करने की कोई आवश्यकता parent.idनहीं है यदि यह अद्यतन करने योग्य नहीं है (या कभी भी अपडेट नहीं किया जाएगा) जैसे कि यह AUTO_INCREMENTहमेशा होता है या हमेशा सेट होता है TIMESTAMP। क्या वह सही है?

  3. यदि (2) सही नहीं है, तो हमें "ON UPDATE CASCADE" का उपयोग किस तरह की स्थिति में करना चाहिए?

  4. क्या होगा अगर मैं (किसी कारण के लिए) child.parent_idकुछ मौजूदा होने के लिए अद्यतन करता हूं, तो क्या यह स्वचालित रूप से हटा दिया जाएगा?

खैर, मुझे पता है, ऊपर दिए गए कुछ सवाल समझने के लिए प्रोग्रामेटिक रूप से टेस्ट किए जा सकते हैं, लेकिन मैं यह भी जानना चाहता हूं कि इसमें से कोई भी डेटाबेस वेंडर पर निर्भर है या नहीं।

कृपया कुछ प्रकाश डालें।


1
इसे भी देखें: stackoverflow.com/questions/6894162/…
Xiè J stackléi

जवाबों:


468

यह सच है कि अगर आपकी प्राथमिक कुंजी सिर्फ एक पहचान मूल्य है, जो आपके लिए बढ़ी हुई है, तो आपके पास ऑन केसकेस के लिए कोई वास्तविक उपयोग नहीं होगा।

हालाँकि, मान लें कि आपकी प्राथमिक कुंजी 10 अंकों वाला UPC बार कोड है और विस्तार के कारण, आपको इसे 13-अंकों वाले UPC बार कोड में बदलने की आवश्यकता है। उस स्थिति में, ऑन केसकेस आपको प्राथमिक कुंजी मान को बदलने की अनुमति देगा और मूल्य के विदेशी कुंजी संदर्भ वाले किसी भी तालिका को तदनुसार बदला जाएगा।

# 4 के संदर्भ में, यदि आप चाइल्ड आईडी को ऐसी चीज़ में बदलते हैं जो मूल तालिका में मौजूद नहीं है (और आपके पास संदर्भात्मक अखंडता है), तो आपको एक विदेशी कुंजी त्रुटि मिलनी चाहिए।


6
बस ON UPDATE CASCADEअपने आप को एक पुरानी तालिका में प्राथमिक कुंजियों को अपडेट करने के लिए उपयोग करना था जो एक ऑटो-इन्क्रिमेंट कुंजी का उपयोग नहीं करता है
ब्लूराजा - डैनी पफ्लुगुएफ्ट

86
  1. हां, इसका मतलब यह है कि उदाहरण के लिए यदि आप UPDATE parent SET id = 20 WHERE id = 10सभी बच्चों के माता-पिता के 10 में से 20 को भी अपडेट किया जाएगा

  2. यदि आप उस फ़ील्ड को अपडेट नहीं करते हैं जिसे विदेशी कुंजी संदर्भित करती है, तो इस सेटिंग की आवश्यकता नहीं है

  3. किसी अन्य उपयोग के बारे में नहीं सोच सकते।

  4. आप ऐसा नहीं कर सकते क्योंकि विदेशी कुंजी बाधा विफल होगी।


29

मुझे लगता है कि आपने बहुत अधिक अंक अर्जित किए हैं!

यदि आप डेटाबेस डिज़ाइन के सर्वोत्तम अभ्यासों का पालन करते हैं और आपकी प्राथमिक कुंजी कभी अपूरणीय नहीं है (जो मुझे लगता है कि हमेशा वैसे भी होना चाहिए), तो आपको वास्तव में ON UPDATE CASCADEक्लॉज़ की आवश्यकता नहीं है ।

जेड ने एक अच्छी बात कही , कि यदि आप अपनी प्राथमिक कुंजी के रूप में एक प्राकृतिक कुंजी (उदाहरण के लिए अपनी डेटाबेस तालिका से एक नियमित फ़ील्ड) का उपयोग करते हैं, तो कुछ निश्चित परिस्थितियाँ हो सकती हैं जहाँ आपको अपनी प्राथमिक कुंजी को अपडेट करने की आवश्यकता होती है। एक और हालिया उदाहरण आईएसबीएन (इंटरनेशनल स्टैंडर्ड बुक नंबर्स) होगा जो 10 से 13 अंकों + वर्णों से बहुत पहले बदल गया था।

यदि आप अपनी प्राथमिक कुंजी (जो सभी दुर्लभ अवसरों में मेरी पसंदीदा पसंद होगी) के रूप में सरोगेट (जैसे आर्टिफिशियल सिस्टम-जनरेटेड) कुंजियों का उपयोग करना चुनते हैं तो यह मामला नहीं है ।

इसलिए अंत में: यदि आपकी प्राथमिक कुंजी कभी नहीं बदलती है, तो आपको कभी भी आवश्यकता नहीं है ON UPDATE CASCADE खंड की ।

न घुलनेवाली तलछट


"कृत्रिम रूप से प्रणाली-जनित" कुंजी क्या है? UUIDs?
एचपीडब्ल्यूडी

1
@HPWD: सिर्फ एक "कृत्रिम" कुंजी जो सिस्टम से उत्पन्न होता (एक मूल्य पर आधारित है कि या आपके वास्तविक डेटा से प्राप्त नहीं है) - यह हो सकता है वास्तव में या कुछ भी - - एक GUID, या एक INT, या एक BIGINT नहीं करता है 'बात नहीं। बिंदु यह है: वह मूल्य किसी भी तरह से आपके स्वयं के, वास्तविक डेटा से संबंधित नहीं है - और सिस्टम आपके लिए स्वचालित रूप से उस मूल्य को उत्पन्न कर रहा है।
marc_s

@ marc-s धन्यवाद कि लिखने के लिए समय निकालने के लिए। आपके जवाब ने सही समझ बनाई।
एचपीडब्ल्यूडी

2
प्राकृतिक कुंजी के साथ एक एकल-स्तंभ तालिका मेरी राय में (कम से कम MySQL DB स्वादों में) enums के लिए एक अच्छा और साफ विकल्प है। उदाहरण के लिए, एक मेज पर विचार colorsपंक्तियों के साथ blue, purple, yellow, और एक मेज productsएक साथ product_colorस्तंभ, करने के लिए किया जा रहा है FK'ed colorsतालिका। यह एक एनुम की तरह विकल्पों को प्रतिबंधित करता है, लेकिन ऑटो-इंक्रीमेंटिंग पूर्णांक के विपरीत इसे रंग का नाम प्राप्त करने के लिए शामिल होने की आवश्यकता नहीं है। ऐसे मामले में, on update cascadeएक अच्छा विचार है, अगर आप तय करते हैं कि इसके बजाय purpleबुलाया जाना चाहिए violet
ओकेडिट

18

कुछ दिनों पहले मुझे ट्रिगर्स के साथ एक मुद्दा मिला है, और मुझे लगा है कि ON UPDATE CASCADEयह उपयोगी हो सकता है। इस उदाहरण को देखें (PostgreSQL):

CREATE TABLE club
(
    key SERIAL PRIMARY KEY,
    name TEXT UNIQUE
);

CREATE TABLE band
(
    key SERIAL PRIMARY KEY,
    name TEXT UNIQUE
);

CREATE TABLE concert
(
    key SERIAL PRIMARY KEY,
    club_name TEXT REFERENCES club(name) ON UPDATE CASCADE,
    band_name TEXT REFERENCES band(name) ON UPDATE CASCADE,
    concert_date DATE
);

मेरे मुद्दे में, मुझे कॉन्सर्ट की मेज को अपडेट करने के लिए कुछ अतिरिक्त संचालन (ट्रिगर) को परिभाषित करना पड़ा। उन ऑपरेशनों को club_name और band_name को संशोधित करना था। संदर्भ के कारण मैं इसे करने में असमर्थ था। मैं कॉन्सर्ट को संशोधित नहीं कर सका और फिर क्लब और बैंड टेबल के साथ सौदा किया। मैं इसे दूसरे तरीके से भी नहीं कर सकता था। ON UPDATE CASCADEसमस्या को हल करने की कुंजी थी।


3
अच्छी टिप्पणी है। मुझे अपडेट कैस्केड पर भी उपयोगी है, किसी भी स्थिति में आपको अपनी आईडी बदलनी होगी। मैं दूसरों से भी सहमत हूं कि यह परिवर्तन इतना विशिष्ट नहीं होना चाहिए। उदाहरण के लिए, आपके द्वारा बोली जाने वाली स्थिति में, मुझे लगता है कि डेटा के बड़े संस्करणों में, संभवतः पाठ फ़ील्ड के उपयोग से संबंधित विदेशी कुंजियों के परिणामस्वरूप डेटाबेस इंजन का सबसे तेज़ प्रदर्शन नहीं हो सकता है। निरीक्षण करें, कि यदि कॉन्सर्ट टेबल में विदेशी संबंध क्लब का उपयोग करता है। SERIAL और बैंड। SERIAL, नाम में परिवर्तन तालिकाओं के बीच के संबंध को प्रभावित नहीं करेगा। हालाँकि, मुझे लगता है कि UPDATE CASCADE आपात स्थितियों को हल करने के लिए एक बढ़िया उपकरण है। सादर
डेविड एल

4
यह एक संदेहास्पद डिजाइन है, जो कि एक अपेक्षाकृत अधिक उदाहरण के लिए बनाता है, हालांकि। दो रखने की क्या बात हैSERIAL में स्तंभों clubऔर bandप्राथमिक कुंजी के रूप में आप संदर्भ अगर nameहर तालिका के प्राथमिक कुंजी के बजाय रों?
एस.एम.

संक्षेप में, यह उपयोगी है यदि आप अन्य तालिका से फ़ील्ड को डुप्लिकेट कर रहे हैं और आपको इसे अद्यतित करने की आवश्यकता है।
कामिल तोमिक्क

4

मेरी टिप्पणी मुख्य रूप से # 3 बिंदु के संदर्भ में है: क्या परिस्थितियों में अद्यतन स्थिति लागू होती है यदि हम मान रहे हैं कि मूल कुंजी अपूरणीय नहीं है? यहाँ एक मामला है।

मैं एक प्रतिकृति परिदृश्य के साथ काम कर रहा हूं जिसमें कई उपग्रह डेटाबेस को एक मास्टर के साथ विलय करने की आवश्यकता है। प्रत्येक उपग्रह एक ही तालिकाओं पर डेटा उत्पन्न कर रहा है, इसलिए तालिकाओं को गुरु में विलय करने से विशिष्टता की बाधा का उल्लंघन होता है। मैं एक समाधान के भाग के रूप में ऑन केसकेस का उपयोग करने का प्रयास कर रहा हूं जिसमें मैं प्रत्येक मर्ज के दौरान कुंजियों को फिर से बढ़ाता हूं। अपडेट के आधार पर प्रक्रिया के भाग को स्वचालित करके इस प्रक्रिया को सरल बनाना चाहिए।


3

यह एक उत्कृष्ट प्रश्न है, कल भी यही प्रश्न था। मैंने इस समस्या के बारे में सोचा, विशेष रूप से खोजा अगर "OND UPDATE CASCADE" जैसी किसी चीज़ का अस्तित्व था और सौभाग्य से SQL के डिजाइनरों ने भी इसके बारे में सोचा था। मैं Ted.strauss से सहमत हूं, और मैंने नोरान के मामले पर भी टिप्पणी की।

मैंने इसका उपयोग कब किया? जैसे टेड ने बताया, जब आप एक समय में कई डेटाबेस का इलाज कर रहे होते हैं, और उनमें से एक में संशोधन, एक तालिका में, किसी भी प्रकार का प्रजनन होता है जिसे टेड "सैटेलाइट डेटाबेस" कहता है, बहुत मूल के साथ नहीं रखा जा सकता है आईडी, और किसी भी कारण से आपको एक नया निर्माण करना होगा, यदि आप पुराने पर डेटा को अपडेट नहीं कर सकते हैं (उदाहरण के लिए अनुमतियों के कारण, या यदि आप किसी मामले में तेजी से खोज कर रहे हैं तो यह बहुत ही कठिन है कि सामान्यीकरण के कुल नियमों के लिए पूर्ण और निष्ठा के सम्मान के लायक नहीं है, केवल इसलिए कि एक बहुत ही अल्पकालिक उपयोगिता होगी)

इसलिए, मैं दो बिंदुओं में सहमत हूं:

(ए) हाँ, कई बार एक बेहतर डिज़ाइन इससे बच सकता है; परंतु

(बी) पलायन के मामलों में, डेटाबेस की प्रतिकृति, या आपात स्थिति को हल करने के लिए, यह एक महान उपकरण है जो सौभाग्य से वहां था जब मैं खोज करने के लिए गया था।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.