2014 के मध्य में Oracle संस्करण 12c से पहले, दुनिया भर में डेटाबेस प्रशासकों की निराशा के लिए, Oracle में तालिका स्कीमा के भीतर स्वाभाविक रूप से ऑटो इंक्रीमेंटिंग कॉलम उत्पन्न करने की कोई अंतर्निहित क्षमता नहीं थी। जबकि इस डिज़ाइन निर्णय के कारणों का केवल अनुमान लगाया जा सकता है, अच्छी खबर यह है कि पुराने Oracle सिस्टम के उपयोगकर्ताओं के लिए भी, इस नुकसान को दूर करने और अपना स्वयं का वृद्धिशील प्राथमिक कुंजी कॉलम बनाने के लिए एक संभावित समाधान है।
एक क्रम बनाना
पहला कदम एक SEQUENCE
बनाना है आपके डेटाबेस में, जो एक डेटा ऑब्जेक्ट है जिसे एकाधिक उपयोगकर्ता स्वचालित रूप से वृद्धिशील मान उत्पन्न करने के लिए एक्सेस कर सकते हैं। जैसा कि दस्तावेज़ीकरण में चर्चा की गई है, Oracle में एक अनुक्रम डुप्लिकेट मानों को एक साथ बनने से रोकता है क्योंकि प्रत्येक अनुक्रमिक आइटम उत्पन्न होने से पहले एकाधिक उपयोगकर्ताओं को प्रभावी रूप से "मोड़ लेने" के लिए मजबूर किया जाता है।
एक नई तालिका के लिए एक अद्वितीय प्राथमिक कुंजी बनाने के प्रयोजनों के लिए, पहले हमें CREATE
. करना होगा जिस तालिका का हम उपयोग करेंगे:
CREATE TABLE books (
id NUMBER(10) NOT NULL,
title VARCHAR2(100) NOT NULL
);
आगे हमें एक PRIMARY KEY
जोड़ना होगा बाधा:
ALTER TABLE books
ADD (
CONSTRAINT books_pk PRIMARY KEY (id)
);
अंत में, हम अपना SEQUENCE
बनाएंगे जिसका उपयोग बाद में वास्तव में अद्वितीय, स्वतः वृद्धिशील मान उत्पन्न करने के लिए किया जाएगा।
CREATE SEQUENCE books_sequence;
एक ट्रिगर जोड़ना
जबकि हमने अपनी तालिका बनाई है और जाने के लिए तैयार है, हमारा क्रम इस प्रकार बस वहीं बैठा है, लेकिन कभी भी उपयोग में नहीं लाया जा रहा है। यह वह जगह है जहां TRIGGERS
अंदर आओ।
event
के समान आधुनिक प्रोग्रामिंग भाषाओं में, एक TRIGGER
Oracle में एक संग्रहीत कार्यविधि है जिसे किसी विशेष घटना के होने पर निष्पादित किया जाता है।
आमतौर पर एक TRIGGER
तालिका के अद्यतन होने या रिकॉर्ड के हटाए जाने पर सक्रिय होने के लिए कॉन्फ़िगर किया जाएगा, आवश्यकता पड़ने पर थोड़ी सफाई प्रदान करते हुए।
हमारे मामले में, हम अपना TRIGGER
. निष्पादित करना चाहते हैं INSERT
. से पहले हमारे books
. में तालिका, हमारे SEQUENCE
. को सुनिश्चित करती है बढ़ा दिया गया है और वह नया मान हमारे प्राथमिक कुंजी कॉलम पर भेज दिया गया है।
CREATE OR REPLACE TRIGGER books_on_insert
BEFORE INSERT ON books
FOR EACH ROW
BEGIN
SELECT books_sequence.nextval
INTO :new.id
FROM dual;
END;
यहां हम TRIGGER
. बना रहे हैं (या अगर यह मौजूद है तो उसे बदल रहे हैं) नाम books_on_insert
और यह निर्दिष्ट करते हुए कि हम चाहते हैं कि ट्रिगर सक्रिय हो BEFORE INSERT
books
. के लिए होता है तालिका, और उसमें किसी भी और सभी पंक्तियों पर लागू होने के लिए।
ट्रिगर का 'कोड' अपने आप में काफी सरल है:हम SELECT
हमारे पहले बनाए गए books_sequence
. से अगला वृद्धिशील मान SEQUENCE
, और उसे :new
. में प्रविष्ट करना books
. का रिकॉर्ड निर्दिष्ट .id
. में तालिका फ़ील्ड.
नोट:FROM dual
एक उचित प्रश्न को पूरा करने के लिए भाग आवश्यक है लेकिन प्रभावी रूप से अप्रासंगिक है। dual
तालिका डेटा की केवल एक डमी पंक्ति है और इसे जोड़ा जाता है, इस मामले में, बस इसे अनदेखा किया जा सकता है और हम इसके बजाय किसी प्रकार के डेटा को वापस करने के बजाय हमारे ट्रिगर के सिस्टम फ़ंक्शन को निष्पादित कर सकते हैं।
पहचान कॉलम
IDENTITY
Oracle 12c में कॉलम पेश किए गए थे, जो Oracle के आधुनिक संस्करणों में सरल ऑटो इंक्रीमेंट कार्यक्षमता की अनुमति देता है।
IDENTITY
का उपयोग करना कॉलम कार्यात्मक रूप से अन्य डेटाबेस सिस्टम के समान है। हमारी उपरोक्त books
को फिर से बनाना आधुनिक Oracle 12c या उच्चतर में तालिका स्कीमा, हम केवल निम्न स्तंभ परिभाषा का उपयोग करेंगे।
CREATE TABLE books (
id NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY,
title VARCHAR2(100) NOT NULL
);