क्या ऐसा कुछ संभव है?
INSERT INTO Table2 (val)
VALUES ((INSERT INTO Table1 (name) VALUES ('a_title') RETURNING id));
पहली तालिका के संदर्भ में दूसरी तालिका में एक पंक्ति सम्मिलित करने के लिए मान के रूप में वापसी मूल्य का उपयोग करना पसंद है?
जवाबों:
आप ऐसा कर सकते हैं Postgres 9.1 के साथ शुरू:
with rows as (
INSERT INTO Table1 (name) VALUES ('a_title') RETURNING id
)
INSERT INTO Table2 (val)
SELECT id
FROM rows
इस बीच, यदि आप केवल आईडी में रुचि रखते हैं, तो आप ट्रिगर के साथ ऐसा कर सकते हैं:
create function t1_ins_into_t2()
returns trigger
as $$
begin
insert into table2 (val) values (new.id);
return new;
end;
$$ language plpgsql;
create trigger t1_ins_into_t2
after insert on table1
for each row
execute procedure t1_ins_into_t2();
rows
साथ (some_query returning ...)
काम करना (आजमाया हुआ नहीं है)।
इस स्थिति के लिए सबसे अच्छा अभ्यास। का उपयोग करें RETURNING … INTO
।
INSERT INTO teams VALUES (...) RETURNING id INTO last_id;
ध्यान दें यह PLPGSQL के लिए है
RETURNING ... INTO
।
डेनिस डे बर्नार्डी द्वारा दिए गए उत्तर के अनुरूप।
यदि आप आईडी को बाद में भी लौटा देना चाहते हैं और तालिका 2 में और चीजें डालना चाहते हैं:
with rows as (
INSERT INTO Table1 (name) VALUES ('a_title') RETURNING id
)
INSERT INTO Table2 (val, val2, val3)
SELECT id, 'val2value', 'val3value'
FROM rows
RETURNING val
आप lastval()
फ़ंक्शन का उपयोग कर सकते हैं :
nextval
किसी भी अनुक्रम के साथ हाल ही में प्राप्त किया गया मान लौटाएं
तो कुछ इस तरह:
INSERT INTO Table1 (name) VALUES ('a_title');
INSERT INTO Table2 (val) VALUES (lastval());
यह तब तक ठीक रहेगा जब तक कोई कॉल नहीं करता nextval()
आपके INSERT के बीच किसी भी अन्य अनुक्रम (वर्तमान सत्र में) पर कोई ।
जैसा कि डेनिस ने नीचे उल्लेख किया है और मैंने ऊपर के बारे में चेतावनी दी है, lastval()
अगर nextval()
आपके INSERTs के बीच एक और अनुक्रम का उपयोग करके एक्सेस किया जाता है, तो आप मुसीबत में पड़ सकते हैं । ऐसा तब हो सकता है जब Table1
उस पर INSERT ट्रिगर होता है जिसे मैन्युअल रूप से nextval()
एक अनुक्रम पर बुलाया जाता है या अधिक संभावना है, एक INSERT एक मेज पर SERIAL
याBIGSERIAL
प्राथमिक कुंजी के साथ किया था। यदि आप वास्तव में पागल होना चाहते हैं (एक अच्छी बात, वे वास्तव में आप सभी के बाद आपको प्राप्त करने के लिए हैं), तो आप उपयोग कर सकते हैं, currval()
लेकिन आपको संबंधित अनुक्रम का नाम जानना होगा:
INSERT INTO Table1 (name) VALUES ('a_title');
INSERT INTO Table2 (val) VALUES (currval('Table1_id_seq'::regclass));
स्वचालित रूप से उत्पन्न अनुक्रम आमतौर पर नामित किया गया है t_c_seq
जहां t
तालिका नाम और c
स्तंभ नाम है, लेकिन आप हमेशा में जाकर पता कर सकते हैं psql
और कह रही:
=> \d table_name;
और फिर प्रश्न में कॉलम के लिए डिफ़ॉल्ट मान को देखते हुए, उदाहरण के लिए:
id | integer | not null default nextval('people_id_seq'::regclass)
FYI करें: lastval()
कम या ज्यादा, MySQL का PostgreSQL संस्करण LAST_INSERT_ID
। मैं केवल इस बात का उल्लेख करता हूं क्योंकि बहुत सारे लोग MySQL से PostgreSQL की तुलना में अधिक परिचित हैं, इसलिए lastval()
किसी परिचित से लिंक करना चीजों को स्पष्ट कर सकता है।
lastval
यह है कि टेबल 1 पर AFS INSERT ट्रिगर से आपकी पीठ के पीछे एक अनुक्रम आधारित INSERT हो सकता है। यह वर्तमान सत्र में होगा और संभवतः, lastval()
जब आप इसकी उम्मीद नहीं कर रहे हैं , तो बदल देंगे।