कुछ डेटाबेस मैनेजमेंट सिस्टम (DBMS) में जनरेटेड कॉलम नामक एक फीचर शामिल होता है।
"गणना किए गए कॉलम" के रूप में भी जाना जाता है, जेनरेट किए गए कॉलम सामान्य कॉलम के समान होते हैं, सिवाय इसके कि जेनरेट किए गए कॉलम का मान एक अभिव्यक्ति से प्राप्त होता है जो अन्य कॉलम से मानों की गणना करता है।
दूसरे शब्दों में, जेनरेट किए गए कॉलम के मान की गणना दूसरे कॉलम से की जाती है।
उदाहरण
जेनरेट किए गए कॉलम कैसे काम करते हैं, यह दिखाने के लिए यहां एक बुनियादी उदाहरण दिया गया है।
CREATE TABLE Products(
Id INTEGER PRIMARY KEY,
Name TEXT,
Qty INT,
Price INT,
TotalValue INT GENERATED ALWAYS AS (Qty * Price)
);
यह उदाहरण SQLite में बनाया गया था और जेनरेट कॉलम बनाने के लिए SQLite सिंटैक्स का उपयोग करता है। यह सिंटैक्स GENERATED ALWAYS
. का उपयोग करता है स्तंभ-बाधा।
GENERATED ALWAYS
भाग SQLite में वैकल्पिक है, इसलिए आप बस AS
. का उपयोग कर सकते हैं .
दरअसल, GENERATED ALWAYS
भाग MySQL में भी वैकल्पिक है, और यह TSQL (SQL सर्वर के लिए SQL एक्सटेंशन) में भी परिभाषित नहीं है, इसलिए AS
कीवर्ड आपको चाहिए (वास्तविक अभिव्यक्ति के साथ)।
अभिव्यक्ति वह है जो कॉलम के वास्तविक मूल्य को निर्धारित करती है। मेरे उदाहरण में, वह भाग जो (Qty * Price)
. पढ़ता है वह व्यंजक है जो उस मान को निर्धारित करता है।
इस मामले में, यह केवल प्रत्येक उत्पाद की कीमत के साथ मात्रा (प्रत्येक उत्पाद की संख्या) को गुणा कर रहा है।
इसलिए इस जेनरेट किए गए कॉलम में इन्वेंट्री में प्रत्येक स्टॉक का कुल मूल्य होता है।
यदि हम डेटा सम्मिलित करते हैं और उसका चयन करते हैं, तो हम जेनरेट किए गए कॉलम का परिकलित मान देख सकते हैं।
INSERT INTO Products VALUES
(1, 'Hammer', 10, 9.99),
(2, 'Saw', 5, 11.34),
(3, 'Wrench', 7, 37.00),
(4, 'Chisel', 9, 23.00),
(5, 'Bandage', 70, 120.00);
SELECT * FROM Products;
परिणाम:
Id Name Qty Price TotalValue ----- ---------- ----- ------ ---------- 1 Hammer 10 9.99 99.9 2 Saw 5 11.34 56.7 3 Wrench 7 37 259 4 Chisel 9 23 207 5 Bandage 70 120 8400
अगर हम पहली पंक्ति को देखें, तो हम देख सकते हैं कि 9.99 प्रत्येक की कीमत पर 10 हथौड़े हैं। उत्पन्न कॉलम इन दो मानों को एक साथ गुणा करता है और हम 99.9 के साथ समाप्त होते हैं।
यदि हम हथौड़ों की संख्या कम कर देते हैं, तो उत्पन्न स्तंभ एक भिन्न मान उत्पन्न करेगा।
यहाँ एक उदाहरण है।
UPDATE Products
SET Qty = 5 WHERE Id = 1;
SELECT * FROM Products;
परिणाम:
Id Name Qty Price TotalValue ----- ---------- ----- ------ ---------- 1 Hammer 5 9.99 49.95 2 Saw 5 11.34 56.7 3 Wrench 7 37 259 4 Chisel 9 23 207 5 Bandage 70 120 8400
इस मामले में मैंने हथौड़ों की संख्या घटाकर 5 कर दी, और इसलिए उत्पन्न कॉलम ने 49.95 के मान की गणना की।
जेनरेट किए गए कॉलम के प्रकार
जेनरेट किए गए कॉलम दो प्रकार के होते हैं; संग्रहीत और आभासी।
कुछ डीबीएमएस थोड़ी अलग शब्दावली का उपयोग कर सकते हैं, उदाहरण के लिए SQL सर्वर "संग्रहीत" के बजाय "लगातार" शब्द का उपयोग करता है। किसी भी तरह से, यह एक ही चीज़ को संदर्भित करता है।
VIRTUAL
:स्तंभ मान संग्रहीत नहीं होते हैं, लेकिन पंक्तियों को पढ़ने पर उनका मूल्यांकन किया जाता है।STORED
:पंक्तियों को डालने या अपडेट करने पर कॉलम मानों का मूल्यांकन और संग्रह किया जाता है।
STORED
इसलिए कॉलम को संग्रहण स्थान की आवश्यकता होती है, जबकि VIRTUAL
कॉलम नहीं है।
हालांकि, इसका मतलब यह भी है कि VIRTUAL
कॉलम पढ़ते समय अधिक CPU चक्रों का उपयोग करते हैं।
जेनरेट किए गए कॉलम के फ़ायदे
जेनरेट किए गए कॉलम क्वेरी लिखते समय समय बचा सकते हैं, त्रुटियों को कम कर सकते हैं और प्रदर्शन में सुधार कर सकते हैं।
जेनरेट किए गए कॉलम प्रश्नों को सरल और एकीकृत करने के तरीके के रूप में उपयोग किए जा सकते हैं। एक जटिल स्थिति को जेनरेट किए गए कॉलम के रूप में परिभाषित किया जा सकता है और फिर टेबल पर एकाधिक प्रश्नों से संदर्भित किया जा सकता है। इससे यह सुनिश्चित करने में मदद मिलती है कि वे सभी एक ही स्थिति का उपयोग करते हैं।
संग्रहीत जेनरेट किए गए कॉलम जटिल परिस्थितियों के लिए भौतिक रूप से कैश के रूप में उपयोग किए जा सकते हैं जिन्हें फ्लाई पर गणना करना महंगा है।
जेनरेट किए गए कॉलम की सीमाएं
सामान्य कॉलम की तुलना में जेनरेट किए गए कॉलम आम तौर पर सीमाओं के साथ आते हैं, हालांकि सीमाओं की सीमा डीबीएमएस द्वारा निर्धारित की जा सकती है।
उदाहरण के लिए, जेनरेट किए गए कॉलम आम तौर पर केवल उसी पंक्ति के कॉलम से मानों की गणना करने में सक्षम होते हैं। हालांकि, गणना किए गए कॉलम की अभिव्यक्ति के हिस्से के रूप में उपयोगकर्ता द्वारा परिभाषित फ़ंक्शन का उपयोग करके इस सीमा को (कम से कम SQL सर्वर में) दूर किया जा सकता है।
विभिन्न डीबीएमएस में जेनरेट किए गए कॉलम के कार्यान्वयन के बारे में अधिक पढ़ने के लिए नीचे दिए गए लिंक देखें।
आधिकारिक दस्तावेज़ीकरण
यहां कुछ लोकप्रिय डीबीएमएस के लिए प्रलेखन है जिसमें जेनरेट किए गए कॉलम के कार्यान्वयन की सीमाएं शामिल हैं:
- एसक्यूएल सर्वर में परिकलित कॉलम
- पोस्टग्रेएसक्यूएल (संस्करण 12) में जेनरेट किए गए कॉलम
- MySQL (संस्करण 8.0) में जेनरेट किए गए कॉलम
- SQLite में जेनरेट किए गए कॉलम