Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

Oracle में एक ऑटो इंक्रीमेंट प्राथमिक कुंजी को कैसे परिभाषित करें

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
);

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ORA-28040:कोई मिलान प्रमाणीकरण प्रोटोकॉल अपवाद नहीं

  2. सी # कॉल ऑरैकल संग्रहीत कार्य

  3. sqlplus वर्तमान में जुड़े डेटाबेस सत्र का विवरण कैसे प्राप्त करें

  4. ORA-00936:लापता अभिव्यक्ति oracle

  5. किसी कनेक्टेड उपयोगकर्ता को Oracle 10g डेटाबेस स्कीमा से हटाना