RETURNING
एक बार की यात्रा . के साथ यह संभव है डेटाबेस के लिए:
INSERT INTO tbl(filename)
VALUES ('my_filename')
RETURNING tbl_id;
tbl_id
आमतौर पर एक serial
होगा या IDENTITY
(पोस्टग्रेज 10 या बाद का) कॉलम। मैनुअल में अधिक।
स्पष्ट रूप से मान प्राप्त करें
अगर filename
tbl_id
. को शामिल करने की आवश्यकता है (अनावश्यक रूप से), आप अभी भी एक ही प्रश्न का उपयोग कर सकते हैं।
lastval()
का प्रयोग करें या अधिक विशिष्ट currval()
:
INSERT INTO tbl (filename)
VALUES ('my_filename' || currval('tbl_tbl_id_seq') -- or lastval()
RETURNING tbl_id;
देखें:
- एक ही INSERT के दौरान दूसरे कॉलम में सीरियल कॉलम का संदर्भ मान
यदि प्रक्रिया में कई अनुक्रम उन्नत हो सकते हैं (यहां तक कि ट्रिगर या अन्य दुष्प्रभावों के माध्यम से भी) तो निश्चित तरीका है currval('tbl_tbl_id_seq')
. का उपयोग करना ।
अनुक्रम का नाम
स्ट्रिंग शाब्दिक 'tbl_tbl_id_seq'
मेरे उदाहरण में वास्तविक . माना जाता है अनुक्रम का नाम और regclass
. पर डाला जाता है , जो एक अपवाद उत्पन्न करता है यदि उस नाम का कोई क्रम वर्तमान search_path
में नहीं पाया जा सकता है ।
tbl_tbl_id_seq
तालिका tbl
. के लिए स्वचालित रूप से जेनरेट किया गया डिफ़ॉल्ट है एक सीरियल कॉलम के साथ tbl_id
. लेकिन कोई गारंटी नहीं हैं। एक कॉलम डिफ़ॉल्ट किसी भी . से मान प्राप्त कर सकता है अनुक्रम यदि ऐसा परिभाषित किया गया है। और यदि तालिका बनाते समय डिफ़ॉल्ट नाम लिया जाता है, तो Postgres एक साधारण एल्गोरिथम के अनुसार अगला मुफ़्त नाम चुनता है।
अगर आप पता नहीं एक serial
. के अनुक्रम का नाम कॉलम, समर्पित फ़ंक्शन का उपयोग करें pg_get_serial_sequence()
. मक्खी पर किया जा सकता है:
INSERT INTO tbl (filename)
VALUES ('my_filename' || currval(pg_get_serial_sequence('tbl', 'tbl_id'))
RETURNING tbl_id;
db<>फिडल यहाँ
पुराना sqlfiddle