डेटाबेस पर अड़चन डालने में संकोच न करें। आपके पास एक सुसंगत डेटाबेस होना निश्चित है, और वह डेटाबेस का उपयोग करने के अच्छे कारणों में से एक है। खासकर यदि आपके पास कई एप्लिकेशन हैं (या सिर्फ एक आवेदन लेकिन एक सीधा मोड और विभिन्न स्रोतों का उपयोग करके एक बैच मोड के साथ)।
MySQL के साथ आपके पास उन्नत अवरोध नहीं होते हैं जैसे कि आप postgreSQL में होते हैं लेकिन कम से कम विदेशी कुंजी बाधाएँ काफी उन्नत होती हैं।
हम एक उदाहरण लेंगे, एक कंपनी तालिका जिसमें उपयोगकर्ता तालिका होती है जिसमें थ्रेस कंपनी के लोग होते हैं
CREATE TABLE COMPANY (
company_id INT NOT NULL,
company_name VARCHAR(50),
PRIMARY KEY (company_id)
) ENGINE=INNODB;
CREATE TABLE USER (
user_id INT,
user_name VARCHAR(50),
company_id INT,
INDEX company_id_idx (company_id),
FOREIGN KEY (company_id) REFERENCES COMPANY (company_id) ON...
) ENGINE=INNODB;
आइए नजर डालते हैं UPDATE क्लॉज पर:
- अद्यतन विवरण पर : डिफ़ॉल्ट : यदि आप टेबल में एक company_id को अपडेट करने का प्रयास करते हैं तो कंपनी इस इंजन को इस कंपनी पर कम से कम लिंक होने पर ऑपरेशन को अस्वीकार कर देगी।
- अद्यतन नहीं अधिनियम : RESTRICT के समान।
- पर अद्यतन CASCADE : आमतौर पर सबसे अच्छा एक : यदि आप तालिका कंपनी की एक पंक्ति में एक company_id अद्यतन इंजन इस कंपनी को संदर्भित सभी उपयोगकर्ता पंक्तियों (लेकिन कोई भी ट्रिगर उपयोगकर्ता की मेज पर सक्रिय, चेतावनी) पर तदनुसार अपडेट कर देगा। इंजन आपके लिए परिवर्तनों को ट्रैक करेगा, यह अच्छा है।
- अद्यतन सेट पर : यदि आप तालिका की एक पंक्ति में एक company_id को अपडेट करते हैं तो कंपनी NULL (USER company_id फ़ील्ड में उपलब्ध होनी चाहिए) से संबंधित USERs company_id सेट करेगी। मैं किसी भी दिलचस्प चीज़ को अपडेट पर नहीं देख सकता, लेकिन मैं गलत हो सकता हूं।
और अब DELETE की तरफ:
- DELETE RESTRICT : डिफ़ॉल्ट : यदि आप किसी company_id आईडी को टेबल में हटाने का प्रयास करते हैं तो कंपनी ऑपरेशन को अस्वीकार कर देगी यदि एक USER कम से कम इस कंपनी से लिंक करता है, तो आपका जीवन बच सकता है।
- DELETE NO ACTION : RESTRICT के समान
- DELETE CASCADE पर : खतरनाक : यदि आप तालिका में किसी कंपनी की पंक्ति हटाते हैं तो कंपनी इंजन संबंधित USER को हटा देगी। यह खतरनाक है, लेकिन इसका उपयोग माध्यमिक तालिकाओं पर स्वचालित सफाई करने के लिए किया जा सकता है (इसलिए यह कुछ ऐसा हो सकता है जो आप चाहते हैं, लेकिन निश्चित रूप से कंपनी के लिए नहीं <-> USER उदाहरण)
- DELETE SET NULL : मुट्ठी भर पर : यदि आप किसी कंपनी की पंक्ति हटाते हैं तो संबंधित USER अपने आप NULL से संबंध बना लेगा। यदि नल किसी भी कंपनी के साथ उपयोगकर्ताओं के लिए आपका मूल्य है, तो यह एक अच्छा व्यवहार हो सकता है, उदाहरण के लिए शायद आपको अपने एप्लिकेशन में उपयोगकर्ताओं को कुछ सामग्री के लेखकों के रूप में रखने की आवश्यकता है, लेकिन कंपनी को हटाना आपके लिए कोई समस्या नहीं है।
आमतौर पर मेरा डिफ़ॉल्ट है: अपडेट के आधार पर अपडेट करें । ON DELETE CASCADE
ट्रैक टेबल के लिए कुछ (लॉग - सभी लॉग नहीं -, उस तरह की चीजें) और ON DELETE SET NULL
जब मास्टर टेबल विदेशी कुंजी वाली तालिका के लिए एक 'सरल विशेषता' है, तो USER तालिका के लिए एक JOB तालिका की तरह।
संपादित करें
मुझे लिखे हुए बहुत समय हो गया है। अब मुझे लगता है कि मुझे एक महत्वपूर्ण चेतावनी जोड़नी चाहिए। MySQL में कैस्केड के साथ एक बड़ा डॉक्यूमेंटेड लिमिटेशन है। कैस्केड ट्रिगर नहीं कर रहे हैं । इसलिए यदि आप ट्रिगर का उपयोग करने के लिए उस इंजन में पर्याप्त आश्वस्त थे, तो आपको कैस्केड बाधाओं से बचना चाहिए।
MySQL ट्रिगर केवल SQL स्टेटमेंट द्वारा तालिकाओं में किए गए परिवर्तनों के लिए सक्रिय होता है। वे विचारों में परिवर्तन के लिए सक्रिय नहीं होते हैं, और न ही एपीआई द्वारा किए गए तालिकाओं में परिवर्तन के द्वारा जो MySQL सर्वर पर SQL स्टेटमेंट को प्रसारित नहीं करते हैं
==> अंतिम संपादन के नीचे देखें, इस डोमेन पर चीजें आगे बढ़ रही हैं
ट्रिगर विदेशी कुंजी क्रियाओं द्वारा सक्रिय नहीं होते हैं।
और मुझे नहीं लगता कि यह एक दिन तय हो जाएगा। विदेशी प्रमुख बाधाओं को InnoDb भंडारण द्वारा प्रबंधित किया जाता है और ट्रिगर MySQL SQL इंजन द्वारा प्रबंधित किया जाता है। दोनों अलग हो गए। इंसोडब प्रबंधन के साथ इनोडब एकमात्र भंडारण है, शायद वे एक दिन सीधे भंडारण इंजन में ट्रिगर जोड़ देंगे, शायद नहीं।
लेकिन मेरी अपनी राय है कि आपको खराब ट्रिगर कार्यान्वयन और बहुत उपयोगी विदेशी कुंजी के बीच किस तत्व का समर्थन करना चाहिए। और एक बार जब आप डेटाबेस की संगति के लिए अभ्यस्त हो जाएंगे तो आपको PostgreSQL से प्यार होगा।
12/2017-यह अपडेट MySQL के बारे में संपादित करें:
जैसा कि @IstiaqueAhmed ने टिप्पणियों में कहा है, इस विषय पर स्थिति बदल गई है। तो लिंक का पालन करें और वास्तविक स्थिति की जांच करें (जो भविष्य में फिर से बदल सकती है)।
ON DELETE CASCADE : dangerous
- एक चुटकी नमक के साथ लें।