मैंने ओरेकल डॉक्यूमेंटेशन में अपडेटेड ज्वाइन सेक्शन में की-प्रोटेक्टेड टेबल के बारे में पढ़ा।
हालाँकि, मुझे इसे समझने का कोई सरल तरीका नहीं मिला।
मुझे आधिकारिक ओरेकल प्रलेखन के अलावा कुछ सरल वैचारिक विवरण प्राप्त होने की उम्मीद है।
मैंने ओरेकल डॉक्यूमेंटेशन में अपडेटेड ज्वाइन सेक्शन में की-प्रोटेक्टेड टेबल के बारे में पढ़ा।
हालाँकि, मुझे इसे समझने का कोई सरल तरीका नहीं मिला।
मुझे आधिकारिक ओरेकल प्रलेखन के अलावा कुछ सरल वैचारिक विवरण प्राप्त होने की उम्मीद है।
जवाबों:
कुंजी संरक्षित का मतलब है कि 1 कुंजी मूल्य 1 टेबल पर जाता है। काउंटर उदाहरण देने से आपको इस अवधारणा को बेहतर ढंग से समझने में मदद मिल सकती है।
उदाहरण 1:
आपके विचार में एकत्रीकरण है। मान लीजिए कि आपके पास दृश्य संरचना है।
GroupID, AverageSalary
1 , 10000
2, 12000
3, 14000
इस उदाहरण में: आपके मान एक से अधिक पंक्तियों से आते हैं। यदि आप इस दृश्य में एवरसालरी को अपडेट करने का प्रयास करते हैं, तो डेटाबेस के पास अपडेट करने के लिए WHICH पंक्तियों को खोजने का कोई तरीका नहीं है।
उदाहरण 2: आपका दृश्य एक से अधिक तालिका से मान दिखाता है। आपका दृश्य PERSON और PERSON_CONTACT_DET Colors (ID, PersonID, ContactType, ContactValue) तालिका से मान दिखाता है।
उदाहरण पंक्तियाँ:
1,1,email,ddd@example.com
1,1,phone,898-98-99
आप इस 2 तालिका से जुड़ते हैं और देखने में अधिक व्यापार के अनुकूल जानकारी दिखाते हैं।
व्यक्ति नाम, नाम, अंतिम नाम, फोन 1, ईमेल 1
यहां आप Phone1 और Email1 को अपडेट करना चाहेंगे। लेकिन इस उदाहरण में दो अलग-अलग पंक्तियों के लिए आपका personID नक्शे हैं, अधिक पंक्तियाँ हो सकती हैं। इस दृश्य में, फिर से, डेटाबेस के पास अपडेट करने के लिए WHICH पंक्तियों को खोजने का कोई तरीका नहीं है।
नोट: यदि आप अपने दृश्य को प्रतिबंधित करते हैं और यह स्पष्ट कर देता है कि कौन सी पंक्तियों को अद्यतन करने के लिए यह काम कर सकता है।
यह दो उदाहरण पहले उदाहरण हैं जो मेरे दिमाग में आते हैं। इन्हें बढ़ाया जा सकता है। लेकिन अवधारणा स्पष्ट है। डेटाबेस को 1 टेबल के लिए 1 महत्वपूर्ण मान को मैप करना होगा। उदाहरण के लिए आपके पास एक से एक PERSON, PERSON_DET Colors टेबल हैं। यहां व्यू और अपडेट एक के बाद एक काम करेगा।
प्रलेखन आप पहले से ही पढ़ा है बहुत अच्छी तरह से यह कहते हैं। आगे समझाने के लिए:
कुंजी-संरक्षित तालिका की अवधारणा में शामिल होने के विचारों को संशोधित करने पर प्रतिबंध को समझना बुनियादी है।
आम तौर update
पर एक ही मेज पर एक कार्य करता है। फ़िल्टर में यातनापूर्ण उपश्रेणियों से बचने के लिए, ओरेकल आपको update
एक दृश्य (या सबक्वेरी) के लिए अनुमति देता है जब तक कि यह अभी भी आसानी से एक तालिका में वास्तविक अंतर्निहित पंक्तियों पर आपके द्वारा किए जा रहे परिवर्तनों को आसानी से मैप करने में सक्षम हो। यह संभव है यदि set
खंड केवल 'कुंजी संरक्षित' तालिका में स्तंभों को संशोधित करता है:
यदि तालिका की प्रत्येक कुंजी भी जुड़ने के परिणाम की कुंजी हो सकती है, तो एक तालिका कुंजी-संरक्षित होती है। तो, एक की-प्रोटेक्टेड टेबल में इसकी कुंजियाँ एक जॉइन के माध्यम से संरक्षित होती हैं।
उदाहरण के लिए:
create table foo( foo_id integer primary key, foo_val integer not null );
create table bar( bar_id integer primary key, bar_val integer not null,
foo_id integer not null references foo );
update (select * from foo join bar using(foo_id)) set foo_val=1;
ORA-01779: cannot modify a column which maps to a non key-preserved table
update (select * from foo join bar using(foo_id)) set bar_val=1;
0 rows updated.
1 मानचित्रण: पहले अद्यतन विफल रहता है क्योंकि ओरेकल 1 का कोई रास्ता नहीं है foo_val
करने के लिए क्वेरी में foo_val
में foo
1 प्रत्येक नक्शा: इसके विपरीत दूसरा अद्यतन सफल होता है क्योंकि ओरेकल कर सकते हैं 1 - bar_val
करने के लिए bar_val
में bar
। महत्वपूर्ण बात यह है कि foo_id
यह अद्वितीय है foo
- इसलिए प्रत्येक पंक्ति के लिए bar
, इसमें केवल एक ही संगत पंक्ति हो सकती है foo
(वास्तव में इस उदाहरण में ठीक 1, लेकिन एक अशक्त विदेशी कुंजी के लिए लागू होता है - बिंदु यह है कि वहाँ कभी नहीं है एक से अधिक पंक्ति)।
पहले एक उदाहरण देता हूं और बाद में समझाता हूं। 2 टेबल स्टूडेंट्स (t_students) और कोर्स (t_course) पर विचार करें।
- छात्र तालिका में स्टूडेंट टेबल (स्टेंडेंटिड, नाम, कोर्सिड) की एक प्राथमिक कुंजी है।
- पाठ्यक्रम तालिका (कोर्सिड, कोर्सेंस) में पाठ्यक्रम आईडी पर एक प्राथमिक कुंजी है।
जब इन दो तालिकाओं को मिलाया जाता है ->
select * from t_students S, t_course C where S.courseid=C.courseid;
परिणामी डेटा में छात्र तालिका के समान पंक्तियों की संख्या होगी। परिणाम सेट में छात्र का कोई डुप्लिकेट मान नहीं होगा (छात्र संरक्षित है)। हालांकि, पाठ्यक्रम तालिका में पाठ्यक्रम अद्वितीय है, हालांकि, परिणाम सेट में इसे कई बार दोहराया जाएगा, क्योंकि कई छात्रों ने एक ही पाठ्यक्रम के लिए चुना हो सकता है (दूसरे शब्दों में, पाठ्यक्रम को संरक्षित नहीं किया गया है)।
जगह में इस उदाहरण के साथ, आप एक निष्कर्ष पर आ सकते हैं कि:
- आधार तालिका में प्रत्येक कुंजी शामिल होने के बाद परिणामी डेटा की कुंजी के रूप में कार्य करती है (छात्र)
- आधार पंक्ति से पंक्तियाँ परिणामी डेटा में केवल एक बार दिखाई देती हैं। (कोई डुप्लिकेट पंक्तियाँ नहीं)
यह कुंजी संरक्षित टेबल की अवधारणा है।
यह देखने के लिए कि क्या देखने योग्य स्तंभ हैं,
select * from all_updatable_columns where table_name='V_VIEW_NAME';
पुनश्च: बड़े अक्षरों में तालिका / दृश्य नाम प्रदान करें।