दिलचस्प पोस्ट
यह जांच कैसे करें कि कोई प्रक्रिया बैच स्क्रिप्ट के माध्यम से चल रही है या नहीं कैसे jquery का उपयोग कर आईफ्रेम माता पिता पृष्ठ का उपयोग करने के लिए? मेरी समानता = (एक एकल बराबर) का उपयोग सही ढंग से काम क्यों नहीं करता? उबंटू पर एलएक्सटीएल कैसे स्थापित करें I एनएटी / सी # में प्रवेश के लिए बड़ी संख्या में रिकॉर्ड (बल्क डाट) लिखना सी ++ और लिनक्स के साथ उच्च संकल्प टाइमर? केवल सीएसएस का उपयोग कर लिंक को निष्क्रिय कैसे करें? मैं एक्सएमएल में एम्पर्सैंड से कैसे बच सकता हूं ताकि उन्हें एचटीएमएल में संस्थाओं के रूप में प्रस्तुत किया जाए? क्या किसी फ़ंक्शन पर तर्कों की एक चर संख्या पारित हो सकती है? PHP सरणी को जावास्क्रिप्ट में कनवर्ट करें कंस्ट्रक्टर से टेम्प्लेट पैरामीटर का अनुमान क्यों न करें? स्ट्रट्स टैग में #,% और $ के बीच अंतर क्या है? मैं PHP में एक बहुआयामी सरणी कैसे क्रमबद्ध करूं रनटाइम पर कॉलम कैसे दिखाना / छुपाना है? स्कला में मैं एक लूप से कैसे बाहर निकलूं?

पिछली डाली गई आईडी के लिए postgreSQL फ़ंक्शन

मैं तालिका में आखिरी आईडी को कैसे प्राप्त करूं? एमएस एसक्यूएल में SCOPE_IDENTITY है ()

कृपया, इस तरह से कुछ का उपयोग करने की सलाह न दें:

select max(id) from table 

वेब के समाधान से एकत्रित समाधान "पिछली डाली गई आईडी के लिए postgreSQL फ़ंक्शन"

( tl;dr : गोटो विकल्प 3: रिटर्निंग के साथ INSERT)

याद रखें कि पोस्टग्रेस्क्ल में टेबलों के लिए कोई "आईडी" अवधारणा नहीं है, केवल अनुक्रम (जो सामान्य रूप से हैं लेकिन सरोगेट प्राथमिक कुंजी के लिए डिफ़ॉल्ट मानों के रूप में उपयोग नहीं किया जाता है, SERIAL छद्म-प्रकार के साथ)।

यदि आप एक नई डाली पंक्ति का आईडी प्राप्त करने में रुचि रखते हैं, तो कई तरीके हैं:


विकल्प 1: CURRVAL(<sequence name>);

उदाहरण के लिए:

  INSERT INTO persons (lastname,firstname) VALUES ('Smith', 'John'); SELECT currval('persons_id_seq'); 

अनुक्रम का नाम जाना चाहिए, यह वाकई मनमानी है; इस उदाहरण में हम यह मानते हैं कि टेबल persons पास एक id कॉलम है जो SERIAL छद्म-प्रकार के साथ बनाया गया है। इस पर निर्भर रहने और अधिक साफ महसूस करने के लिए, आप इसके बजाय pg_get_serial_sequence उपयोग कर सकते हैं:

  INSERT INTO persons (lastname,firstname) VALUES ('Smith', 'John'); SELECT currval(pg_get_serial_sequence('persons','id')); 

चेतावनी: currval() केवल एक INSERT (जो कि nextval() को निष्पादित कर लिए जाने के बाद काम करता है), उसी सत्र में


विकल्प 2: LASTVAL();

यह पिछले के समान है, केवल आपको अनुक्रम नाम निर्दिष्ट करने की आवश्यकता नहीं है: यह सबसे हाल ही में संशोधित अनुक्रम (हमेशा अपने सत्र के अंदर, ऊपर की तरह ही चेतावनी) के लिए दिखता है।


दोनों CURRVAL और LASTVAL पूरी तरह समसामयिक सुरक्षित हैं पीजी में अनुक्रम के व्यवहार को डिज़ाइन किया गया है ताकि अलग सत्र हस्तक्षेप न करें, इसलिए दौड़ परिस्थितियों का कोई खतरा नहीं है (यदि कोई अन्य सत्र मेरे INSERT और मेरी SELECT के बीच एक और पंक्ति सम्मिलित करता है, तो मुझे अभी भी सही मान प्राप्त होता है)।

हालांकि उनके पास एक सूक्ष्म संभावित समस्या है यदि डेटाबेस में कुछ ट्रिगर (या नियम) है, कि persons तालिका में प्रवेश करने पर, अन्य तालिकाओं में कुछ अतिरिक्त प्रविष्टियां LASTVAL … तो LASTVAL हमें गलत मान देगा समस्या भी CURRVAL साथ हो CURRVAL , अगर अतिरिक्त सम्मिलन एक ही persons तालिका में किया जाता है (यह बहुत कम है, लेकिन जोखिम अभी भी मौजूद है)।


विकल्प 3: RETURNING साथ INSERT

 INSERT INTO persons (lastname,firstname) VALUES ('Smith', 'John') RETURNING id; 

आईडी प्राप्त करने के लिए यह सबसे स्वच्छ, कुशल और सुरक्षित तरीका है। इसमें पिछले किसी भी जोखिम का नहीं है

कमियां? लगभग कोई भी नहीं: आपको अपनी INSERT स्टेटमेंट को कॉल करने के तरीके को संशोधित करने की आवश्यकता हो सकती है (सबसे खराब स्थिति में, शायद आपका एपीआई या डीबी परत आईएनएसईआरटी को एक मान वापस करने की उम्मीद नहीं करता है); यह मानक एसक्यूएल (जो परवाह करता है) नहीं है; यह Postgresql 8.2 (दिसंबर 2006 …) के बाद से उपलब्ध है


निष्कर्ष: यदि आप कर सकते हैं, तो विकल्प 3 के लिए जाएं। कहीं और, 1 पसंद करें।

नोट: यदि आप पिछले विश्वव्यापी प्रविष्टि आईडी प्राप्त करने का इरादा रखते हैं तो ये सभी विधियां बेकार हैं (जरूरी नहीं कि आपके सत्र में)। इसके लिए, आपको select max(id) from table का select max(id) from table करना चाहिए (ज़ाहिर है, यह अन्य लेन-देन से अनकही सम्मिलित आवेषण नहीं पढ़ेगा)।

INSERT स्टेटमेंट का रिटर्निंग क्लॉज देखें असल में, INSERT एक क्वेरी के रूप में दोगुना है और उस मूल्य को वापस देता है जिसे डाला गया था।

आप INSERT स्टेटमेंट में रिटर्निंग क्लॉज का उपयोग कर सकते हैं, जैसे निम्नलिखित

 wgzhao=# create table foo(id int,name text); CREATE TABLE wgzhao=# insert into foo values(1,'wgzhao') returning id; id ---- 1 (1 row) INSERT 0 1 wgzhao=# insert into foo values(3,'wgzhao') returning id; id ---- 3 (1 row) INSERT 0 1 wgzhao=# create table bar(id serial,name text); CREATE TABLE wgzhao=# insert into bar(name) values('wgzhao') returning id; id ---- 1 (1 row) INSERT 0 1 wgzhao=# insert into bar(name) values('wgzhao') returning id; id ---- 2 (1 row) INSERT 0 

लियोनबॉयल का उत्तर काफी पूर्ण है। मैं केवल विशेष मामले को जोड़ता हूं जिसमें एक को पीएल / पीजीएसक्यूएल फ़ंक्शन के अंदर से अंतिम डाला गया मान प्राप्त करने की आवश्यकता होती है, जहां विकल्प 3 बिल्कुल फिट नहीं है I

उदाहरण के लिए, यदि हमारे पास निम्न तालियां हैं:

 CREATE TABLE person( id serial, lastname character varying (50), firstname character varying (50), CONSTRAINT person_pk PRIMARY KEY (id) ); CREATE TABLE client ( id integer, CONSTRAINT client_pk PRIMARY KEY (id), CONSTRAINT fk_client_person FOREIGN KEY (id) REFERENCES person (id) MATCH SIMPLE ); 

यदि हमें एक क्लाइंट रिकॉर्ड डालने की आवश्यकता है तो हमें किसी व्यक्ति के रिकॉर्ड को संदर्भित करना चाहिए। लेकिन मान लीजिए कि हम एक पीएल / पीजीएसएलएल फ़ंक्शन की तलाश करना चाहते हैं जो क्लाइंट में एक नया रिकार्ड डालता है, लेकिन नए व्यक्ति के रिकॉर्ड को सम्मिलित करने का ख्याल भी रखता है। इसके लिए, हमें लेबनब्लय के विकल्प की थोड़ी भिन्नता का उपयोग करना चाहिए 3:

 INSERT INTO person(lastname, firstname) VALUES (lastn, firstn) RETURNING id INTO [new_variable]; 

ध्यान दें कि दो मुख्य धाराएं हैं I इसलिए, PL / pgSQL फ़ंक्शन को निम्न प्रकार से परिभाषित किया जाएगा:

 CREATE OR REPLACE FUNCTION new_client(lastn character varying, firstn character varying) RETURNS integer AS $BODY$ DECLARE v_id integer; BEGIN -- Inserts the new person record and retrieves the last inserted id INSERT INTO person(lastname, firstname) VALUES (lastn, firstn) RETURNING id INTO v_id; -- Inserts the new client and references the inserted person INSERT INTO client(id) VALUES (v_id); -- Return the new id so we can use it in a select clause or return the new id into the user application RETURN v_id; END; $BODY$ LANGUAGE plpgsql VOLATILE; 

अब हम इस का उपयोग करते हुए नए डेटा को सम्मिलित कर सकते हैं:

 SELECT new_client('Smith', 'John'); 

या

 SELECT * FROM new_client('Smith', 'John'); 

और हमें नव निर्मित आईडी मिलती है

 new_client integer ---------- 1 

नीचे दिए गए उदाहरण देखें

 CREATE TABLE users ( -- make the "id" column a primary key; this also creates -- a UNIQUE constraint and a b+-tree index on the column id SERIAL PRIMARY KEY, name TEXT, age INT4 ); INSERT INTO users (name, age) VALUES ('Mozart', 20); 

फिर आखिरी डाला आईडी प्राप्त करने के लिए तालिका "उपयोगकर्ता" के लिए इसका उपयोग करें seq स्तंभ नाम "id"

 SELECT currval(pg_get_serial_sequence('users', 'id')); 
 SELECT CURRVAL(pg_get_serial_sequence('my_tbl_name','id_col_name')) 

आपको पाठ्यक्रम के तालिका नाम और स्तंभ नाम की आपूर्ति करना होगा।

यह वर्तमान सत्र / कनेक्शन के लिए होगा http://www.postgresql.org/docs/8.3/static/functions-sequence.html

जिन लोगों को सभी डेटा रिकॉर्ड प्राप्त करने की आवश्यकता है, आप जोड़ सकते हैं

 returning * 

आईडी सहित सभी ऑब्जेक्ट प्राप्त करने के लिए आपकी क्वेरी के अंत में

इसे इस्तेमाल करे:

 select nextval('my_seq_name'); // Returns next value 

यदि यह 1 रिटर्न (या जो भी आपके अनुक्रम के लिए start_value है), फिर अनुक्रम वापस मूल मान पर रीसेट करें, झंडा झंडा दे:

 select setval('my_seq_name', 1, false); 

अन्यथा,

 select setval('my_seq_name', nextValue - 1, true); 

यह अनुक्रम मान को मूल स्थिति में पुनर्स्थापित करेगा और "सेटवाल" अनुक्रम मूल्य के साथ लौटाएगा जिसे आप खोज रहे हैं।

अगर आपको कुछ भी सम्मिलित किए बिना अंतिम सम्मिलित आईडी को पुनर्प्राप्त करने की आवश्यकता है तो आप निम्न उदाहरण का उपयोग कर सकते हैं

 SELECT id FROM users ORDER BY id DESC LIMIT 1; 

आशा की मदद कर सकते हैं