उपयोग data-modifying CTEs:
WITH ins1 AS (
INSERT INTO sample(firstname, lastname)
VALUES ('fai55', 'shaggk')
-- ON CONFLICT DO NOTHING -- optional addition in Postgres 9.5+
RETURNING id AS user_id
)
, ins2 AS (
INSERT INTO sample1 (user_id, adddetails)
SELECT user_id, 'ss' FROM ins1
-- RETURNING user_id -- only if used in turn
)
INSERT INTO sample2 (user_id, value) -- same here
SELECT user_id, 'ss' FROM ins1;
प्रत्येक डालने से पहले एक पर निर्भर करता है। SELECT
VALUES
के बजाय यह सुनिश्चित करता है कि पिछली प्रविष्टि से कोई पंक्ति वापस नहीं आती है तो सहायक तालिकाओं में कुछ भी डाला नहीं गया है। (संबंधित: पोस्टग्रेस 9.5+ में ON CONFLICT
खंड)
यह भी थोड़ा सा और तेज़ तरीका है।
आमतौर पर, यह अधिक सुविधाजनक है एक ही स्थान पर में पूरा डेटा पंक्तियों प्रदान करने के लिए:
WITH data(firstname, lastname, adddetails, value) AS (
VALUES -- provide data here
(text 'fai55', text 'shaggk', text 'ss', text 'ss2') -- see below
-- more? -- works for multiple input rows
)
, ins1 AS (
INSERT INTO sample (firstname, lastname)
SELECT firstname, lastname FROM data -- DISTINCT? see below
ON CONFLICT DO NOTHING -- required UNIQUE constraint
RETURNING firstname, lastname, id AS sample_id
)
, ins2 AS (
INSERT INTO sample1 (sample_id, adddetails)
SELECT sample_id, adddetails
FROM data
JOIN ins1 USING (firstname, lastname)
RETURNING sample_id, user_id
)
INSERT INTO sample2 (user_id, value)
SELECT user_id, value
FROM data
JOIN ins1 USING (firstname, lastname)
JOIN ins2 USING (sample_id);
आप के रूप में एक VALUES
अभिव्यक्ति करने का विरोध एक अलग VALUES
अभिव्यक्ति में स्पष्ट प्रकार डाले आवश्यकता हो सकती है (एक आईएनएसईआरटी से जुड़ा हुआ है, जहां डेटा प्रकार लक्ष्य तालिका से व्युत्पन्न होते हैं।
यदि एकाधिक पंक्तियां पहचान के साथ आ सकती हैं कैलोरी (firstname, lastname)
, आपको पहले डालने के लिए डुप्लिकेट गुना करना पड़ सकता है:
...
INSERT INTO sample (firstname, lastname)
SELECT DISTINCT firstname, lastname FROM data
...
आप डेटा स्रोत के बजाय CTE data
के रूप में एक (अस्थायी) तालिका इस्तेमाल कर सकते हैं।
संबंधित अधिक विवरण के साथ:
thanx मैं अगर किसी भी असफल प्रविष्टि .yes होता है बाहर लेनदेन रोल में जोड़ सकते हैं मैं कैसे – Faisal
यह एक एकल एसक्यूएल बयान है कर सकते हैं। कोई भी एक ही लेनदेन में कई बयानों को बंडल कर सकता है, लेकिन कोई इसे विभाजित नहीं कर सकता है। इसके अलावा, डेनिस ने अपनी टिप्पणी में क्या कहा। और मैंने अपने जवाब के कुछ लिंक जोड़ दिए। –
लेकिन क्या आपके पास सीटीई के अंदर एक चयन हो सकता है, और उसके बाद तुरंत INSERT के उपयोग के बाद? – mmcrae