ओरेकल 12 सी के बाद से हम पहचान फ़ील्ड का उपयोग कर सकते हैं।ओरेकल पिछली डाली गई पहचान
क्या अंतिम डाली गई पहचान (यानी select @@identity
या select LAST_INSERTED_ID()
और इतने पर) को पुनर्प्राप्त करने का कोई तरीका है?
ओरेकल 12 सी के बाद से हम पहचान फ़ील्ड का उपयोग कर सकते हैं।ओरेकल पिछली डाली गई पहचान
क्या अंतिम डाली गई पहचान (यानी select @@identity
या select LAST_INSERTED_ID()
और इतने पर) को पुनर्प्राप्त करने का कोई तरीका है?
ठीक है। ओरेकल 12 सी में पहचान कार्यक्षमता के लिए अनुक्रम और डिफ़ॉल्ट मान का उपयोग करता है। इसलिए आपको अपने प्रश्न के अनुक्रमों के बारे में जानना होगा।
पहले परीक्षण पहचान तालिका बनाएं।
CREATE TABLE IDENTITY_TEST_TABLE
(
ID NUMBER GENERATED ALWAYS AS IDENTITY
, NAME VARCHAR2(30 BYTE)
);
सबसे पहले, इस पहचान कॉलम के साथ बनाया गया आपका अनुक्रम नाम ढूंढने दें। यह अनुक्रम नाम आपकी तालिका में एक डिफ़ॉल्ट मान है।
Select TABLE_NAME, COLUMN_NAME, DATA_DEFAULT from USER_TAB_COLUMNS
where TABLE_NAME = 'IDENTITY_TEST_TABLE';
मेरे लिए यह मान "ISEQ _ 193,606 $$"
कुछ मान सम्मिलित है।
INSERT INTO IDENTITY_TEST_TABLE (name) VALUES ('atilla');
INSERT INTO IDENTITY_TEST_TABLE (name) VALUES ('aydın');
फिर मूल्य डालें और पहचान पाएं।
INSERT INTO IDENTITY_TEST_TABLE (name) VALUES ('atilla');
SELECT "ISEQ$$_193606".currval from dual;
आपको अपना पहचान मान देखना चाहिए। यदि आप एक ब्लॉक में करना चाहते हैं
declare
s2 number;
begin
INSERT INTO IDENTITY_TEST_TABLE (name) VALUES ('atilla') returning ID into s2;
dbms_output.put_line(s2);
end;
अंतिम आईडी मेरा पहचान कॉलम नाम है।
यह एकमात्र सही उत्तर है। आपको बस यह सुनिश्चित करने की आवश्यकता है कि आप उसी सत्र में '
आपका दायरा, वैश्विक या अंतिम उपयोगकर्ता डाला गया क्या है? वैश्विक हैं, बस
SELECT mytable_seq.nextval MyTableID FROM DUAL
https://www.sitepoint.com/community/t/oracle-last-insert-id-question/1402
का उपयोग करते हैं विशिष्ट Encapsulate अपने आवेषण एक सौदे के भीतर & क्वेरी।
उत्तर के लिए धन्यवाद! दायरा अंतिम उपयोगकर्ता है। मुझे लगता है कि आपका सुझाव केवल MySQL के लिए काम करता है। ओरेकल में काम नहीं करता है (सिंटैक्स त्रुटि) 'दोहरी' खंड को भी जोड़ता है। – bubi
ओह क्षमा करें, मैंने लिंक –
को अपडेट किया है जो वैश्विक के लिए है (मैं वर्तमान का भी उपयोग कर सकता हूं लेकिन अभी भी वैश्विक है) – bubi
IDENTITY
कॉलम "हुड के नीचे" SEQUENCE
का उपयोग करता है - यह उस तालिका के साथ स्वचालित रूप से अनुक्रम बनाकर और छोड़ देता है। इसके अलावा, आप 1000 से शुरू होने और 2 से बढ़ोतरी का उपयोग करके पैरामीटर के साथ प्रारंभ और वृद्धि पैरामीटर निर्दिष्ट कर सकते हैं। जब आप सीधे इसके मानों को संचालित नहीं करना चाहते हैं तो IDENTITY
का उपयोग करना बहुत सुविधाजनक है।
लेकिन अगर आपको सीधे अनुक्रम को संचालित करने की आवश्यकता है तो आपको ओरेकल 12 सी - कॉलम डिफ़ॉल्ट मानों में उपलब्ध एक और विकल्प का उपयोग करना चाहिए। सच डिफ़ॉल्ट मान अनुक्रम nextval
या currval
से उत्पन्न किए जा सकते हैं। आपको एक समझदार अनुक्रम नाम रखने और इसे ट्रिगर के बिना "पहचान" के रूप में उपयोग करने की अनुमति देने के लिए।
create table my_new_table
(id number default my_new_table_seq.nextval not null)
आप हमेशा कॉल करने में सक्षम होंगे: my_new_table_seq.currval
।
RETURNING
क्लॉज का उपयोग करके सम्मिलित कथन पर SEQUENCE
से उत्पन्न आईडी प्राप्त करना संभव है।
उदाहरण के लिए, एक अस्थायी तालिका बनाने:
create global temporary table local_identity_storage ("id" number) on commit delete rows
कुछ अस्थायी तालिका में इस मूल्य बचत डालने करें:
CREATE TABLE identity_test_table (
id_ident NUMBER GENERATED BY DEFAULT AS IDENTITY,
same_value VARCHAR2(100)
);
declare
v_id number(10, 0);
begin
INSERT INTO identity_test_table
(same_value)
VALUES
('Test value')
RETURNING id_ident INTO v_id;
insert into local_identity_storage ("id") values (v_id);
commit;
end;
अब आप "स्थानीय" डाला आईडी होना।
select "id" from local_identity_storage
ऐसा लगता है कि ओरेकल ने IDENTITY
को यह कहने के लिए लागू किया कि वे पहचान का समर्थन करते हैं। सब कुछ अभी भी SEQUENCES
का उपयोग करके लागू किया गया है और कभी-कभी आपको कुछ काम करने के लिए SEQUENCE
तक पहुंचने की आवश्यकता होती है (यानी नवीनतम डालने वाले IDENTITY
को पुनर्प्राप्त करें)।
IDENTITY
को MySQL, SQL सर्वर, DB2 के समान पुनर्प्राप्त करने का कोई तरीका नहीं है, और आपको SEQUENCE
का उपयोग करके इसे पुनर्प्राप्त करना होगा।
हां, यह SEQUENCE पर अमूर्त है, लेकिन यह INSERT खंड का सिंटैक्स बदल देगा और यह परिवर्तन भी होगा प्रदर्शन में परिलक्षित हो। तीन अलग-अलग तकनीकों का उपयोग करके इस परीक्षण को देखें (ओरेकल 12 सी में डालना) (यहां से परिणाम [https://oracle-base.com/articles/12c/identity-columns-in-oracle-12cr1]): 1) TRIGGER_IDENTITY : समय = 217 एचएसईसीएस सीपीयू समय = 204 एचएसईसीएस; 2) प्रत्यक्ष उपयोग अनुक्रम: समय = 26 एचएसईसीएस सीपीयू समय = 22 एचसीईसीएस; 3) REAL_IDENTITY: समय = 28 एचएसईसीएस सीपीयू समय = 26 एचसीईसीएस। –
यह ओरेकल डेटाबेस में माइग्रेशन को आसान बनाने के लिए किया गया था। आवेषण पर उन्हें आग लगाने के लिए अनुक्रम और ट्रिगर मैन्युअल रूप से बनाने की आवश्यकता नहीं है - डेटाबेस अब आपके लिए करता है। मैं ओरेकल के लिए बात नहीं करता, लेकिन अगर आप माइग्रेशन में सहायता के लिए 12 सी में हमने और क्या किया है, तो मुझे इस विषय पर एक श्वेतपत्र है। – thatjeffsmith
@thatjeffsmith मैं वास्तव में माइग्रेशन कर रहा हूं लेकिन अन्य डीबीएमएस के समान व्यवहार के बिना काम कठिन है। – bubi
की जांच करें
INSERT INTO yourtable (....)
VALUES (...)
RETURNING pk_id INTO yourtable;
यह आप पिछले डाला पंक्ति
'identity' कॉलम अभी भी पृष्ठभूमि में एक दृश्य का उपयोग पुनः प्राप्त करने में मदद मिलेगी। अंतिम उत्पन्न मूल्य प्राप्त करने के लिए आपको सामान्य 'sequence.currval' का उपयोग करने में सक्षम होना चाहिए। –
मुद्दा यह है कि मुझे अनुक्रम का नाम जानना है। Actaully तालिका के नाम और स्कीमा का नाम जानना मुश्किल है जहां मैंने रिकॉर्ड डाला (अनुक्रम का नाम उनसे संबंधित है)। – bubi
आप जिस टेबल को सम्मिलित कर रहे हैं उसका नाम _not_ कैसे पता कर सकते हैं? –