15

मेरा उद्देश्य तालिका में नई पंक्ति डालने पर प्राथमिक कुंजी फ़ील्ड स्वचालित रूप से डालने का है।currval अभी तक इस सत्र को परिभाषित नहीं किया गया है, बहु-सत्र अनुक्रम कैसे प्राप्त करें?

PostgreSQL में सत्र से सत्र में अनुक्रम कैसे प्राप्त करें?

[email protected]:/home/yves$ psql -d test 
Mot de passe : 
psql (8.4.13) 
Saisissez « help » pour l''aide. 

test=> create sequence test001 start 10; 
CREATE SEQUENCE 
test=> select currval('test001'); 
ERREUR: la valeur courante (currval) de la séquence « test00 » n''est pas encore définie dans cette session 
--- current value not yet defined this session (???) 
test=> select setval('test001', 10); 
setval 
-------- 
     10 
(1 ligne) 

test=> select currval('test00'); 
    currval 
--------- 
     10 
(1 ligne) 

test=> \q 
[email protected]:/home/yves$ psql -d test 
Mot de passe : 
psql (8.4.13) 
Saisissez « help » pour l''aide. 

test=> select currval('test001'); 
ERREUR: la valeur courante (currval) de la séquence « test00 » n''est pas encore définie dans cette session 
+0

अनुक्रम का पूरा उद्देश्य यह सत्र स्थानीय है। आप दूसरे सत्र में घुमाव को "हाथ" नहीं दे सकते। आपको ऐसा क्यों लगता है कि आपको इसकी आवश्यकता है? एक ही लेनदेन में सबकुछ क्यों नहीं करते? –

+0

@a_horse_with_no_name क्योंकि मेरे पास एक ही समय में दो सत्र खोले गए हैं: एक व्यवस्थापक एक और एक उत्पादन। तो मुझे दो अलग सत्र होना चाहिए। –

+0

क्यों एक अनुक्रम नहीं बनाते हैं और फिर इसे दो सत्रों के बीच साझा करते हैं? वे अद्वितीय आईडी प्राप्त कर रहे हैं, काम किया। –

उत्तर

10

इस सरल से आपको लगता है हो सकता है ...

मेरे उद्देश्य एक प्राथमिक कुंजी क्षेत्र स्वतः डाला जब तालिका में नई पंक्ति सम्मिलित पाने के लिए है।

बस स्तंभ का डिफ़ॉल्ट मान सेट करें:

ALTER TABLE tbl ALTER COLUMN tbl_id SET DEFAULT nextval('my_seq'::regclass); 

या सरल अभी तक, प्राथमिक कुंजी के लिए एक serial प्रकार के साथ तालिका बनाने के साथ शुरू:

CREATE TABLE tbl(
    tbl_id serial PRIMARY KEY 
,col1 txt 
    -- more columns 
); 

यह एक बनाता है समर्पित अनुक्रम और स्वचालित रूप से tbl_id के लिए डिफ़ॉल्ट सेट करता है।

इस तरह tbl_id स्वचालित रूप से संलग्न अनुक्रम से अगला मान असाइन किया गया है यदि आप INSERT में इसका उल्लेख नहीं करते हैं। किसी भी सत्र, समवर्ती या नहीं के साथ काम करता है।

INSERT INTO tbl(col1) VALUES ('foo'); 

आप नए tbl_id वापस इसके साथ कुछ करना चाहते हैं:

INSERT INTO tbl(col1) VALUES ('foo') RETURNING tbl_id; 
59

currval वर्तमान सत्र के भीतर अनुक्रम के लिए उत्पन्न पिछले मान प्रदान करेंगे। इसलिए यदि कोई अन्य सत्र अनुक्रम के लिए एक नया मान उत्पन्न करता है तो भी आप त्रुटियों से परहेज करते हुए अपने सत्र द्वारा उत्पन्न अंतिम मूल्य पुनर्प्राप्त कर सकते हैं।

लेकिन, किसी भी सत्र पर पिछले उत्पन्न मूल्य प्राप्त करने के लिए, आप उपयोग कर सकते हैं इसके बाद के संस्करण:

SELECT last_value FROM your_sequence_name; 

, सावधान रहें मूल्य एक uncommited (या निरस्त) लेन-देन और उसे अपने साथ अन्य सत्र द्वारा इस्तेमाल किया गया था इस मान का संदर्भ के रूप में उपयोग करें, आपको एक त्रुटि मिल सकती है। आम तौर पर लोगों को केवल currval या setval की वापसी की आवश्यकता होती है।

+0

अन्य सत्र द्वारा जेनरेट किया गया अंतिम मूल्य कैसे प्राप्त करें। यदि मैं गायक डीबी उपयोगकर्ता का उपयोग कर रहा हूं तो क्या यह अभी भी सटीकता को प्रभावित करेगा? – Volatil3

+0

क्रियात्मक रूप से यह दिलचस्प है, आधिकारिक दस्तावेज़ीकरण में 'अनुक्रम से * चयन करने की संभावना' का भी उल्लेख क्यों नहीं किया गया है? – Eugene

1

असल nextval अनुक्रम अग्रिम और नए मान, ताकि अपने प्रश्न के लिए जवाब होगा होगा।

घुमाव हाल ही में निर्दिष्ट अनुक्रम के लिए अगले संस्करण के साथ प्राप्त मूल्य को वापस कर देगा (हालांकि वर्तमान सत्र में अगली बार उपयोग नहीं किया जा सकता है)।

0

यह समस्या स्थिरता के लिए CTE का उपयोग notifn से वर्तमान सत्र

साथ चयन अब() के रूप में (notifn_main (notifn_dt, stat_id) में सम्मिलित डाला, 22 के लिए डाला अनुक्रम प्राप्त करने के लिए, रुक-रुक कर हो रहा है वापसी आईडी) आईएनटीओ tmp_id डालने से आईडी चुनें;

0

मैं इस मामले के लिए व्यावहारिक उत्तर दूंगा। मेरा डेटाबेस सर्वर मेरे प्रोग्राम और मेरे psql टर्मिनल द्वारा उपयोग किया जाता है; तो कई सत्र हैं। वर्तमान में मैं अपने psql टर्मिनल में हूं:

fooserver=> select currval('fusion_id_seq'); 
ERROR: currval of sequence "fusion_id_seq" is not yet defined in this session 
fooserver=> select nextval('fusion_id_seq'); 
nextval 
--------- 
    320032 
(1 row) 

fooserver=> select currval('fusion_id_seq'); 
currval 
--------- 
    320032 
(1 row) 

ऐसा लगता है कि आप केवल अपने सत्र में मूल्य देख सकते हैं। यह किसी अन्य सत्र के currval को भी प्रभावित करेगा। यह शायद अलग सत्र को अलग करने के लिए सर्वर के बहु-थ्रेडिंग से संबंधित है। काउंटर (psql में धारावाहिक) एक साझा वस्तु है। मेरी राय में, इस सत्र को काउंटर का वर्तमान मूल्य प्राप्त करने में सक्षम होना चाहिए जब तक कि काउंटर ठीक से लॉक हो, यह सुनिश्चित करने के लिए कि केवल एक थ्रेड (सत्र) इसे बढ़ा सकता है (परमाणु ऑपरेशन)। लेकिन मैं यहां गलत हो सकता हूं (डेटाबेस सर्वर लेखक पर एक विशेषज्ञ नहीं)।

संबंधित मुद्दे