PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

Postgres . का उपयोग करके एक बार में 3 तालिकाओं में डेटा डालें

डेटा-संशोधित 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 sample_id
   )
, ins2 AS (
   INSERT INTO sample1 (sample_id, adddetails)
   SELECT sample_id, 'ss' FROM ins1
   RETURNING user_id
   )
INSERT INTO sample2 (user_id, value)
SELECT user_id, 'ss2' FROM ins2;

प्रत्येक INSERT पहले वाले पर निर्भर करता है। SELECT VALUES . के बजाय सुनिश्चित करता है कि यदि पिछली INSERT से कोई पंक्ति वापस नहीं आती है तो सहायक तालिकाओं में कुछ भी नहीं डाला गया है . (चूंकि 9.5+ पोस्टग्रेज करता है, आप ON CONFLICT जोड़ सकते हैं .)
इस तरह यह थोड़ा छोटा और तेज़ भी है।

आमतौर पर, एक ही स्थान पर संपूर्ण डेटा पंक्तियां प्रदान करना अधिक सुविधाजनक होता है :

WITH data(firstname, lastname, adddetails, value) AS (
   VALUES                              -- provide data here
      ('fai55', 'shaggk', 'ss', 'ss2') -- see below
    , ('fai56', 'XXaggk', 'xx', 'xx2') -- works for multiple input rows
       --  more?                      
   )
, ins1 AS (
   INSERT INTO sample (firstname, lastname)
   SELECT firstname, lastname          -- DISTINCT? see below
   FROM   data
   -- ON     CONFLICT DO NOTHING       -- UNIQUE constraint? see below
   RETURNING firstname, lastname, id AS sample_id
   )
, ins2 AS (
   INSERT INTO sample1 (sample_id, adddetails)
   SELECT ins1.sample_id, d.adddetails
   FROM   data d
   JOIN   ins1 USING (firstname, lastname)
   RETURNING sample_id, user_id
   )
INSERT INTO sample2 (user_id, value)
SELECT ins2.user_id, d.value
FROM   data d
JOIN   ins1 USING (firstname, lastname)
JOIN   ins2 USING (sample_id);

db<>फिडल यहाँ

आपको स्टैंड-अलोन VALUES . में स्पष्ट प्रकार के कास्ट की आवश्यकता हो सकती है अभिव्यक्ति - VALUES . के विपरीत एक INSERT . से जुड़ी अभिव्यक्ति जहां डेटा प्रकार लक्ष्य तालिका से प्राप्त होते हैं। देखें:

  • कई पंक्तियों को अपडेट करते समय NULL प्रकार कास्ट करना

यदि एकाधिक पंक्तियाँ समान (firstname, lastname) . के साथ आ सकती हैं , आपको पहले INSERT . के लिए डुप्लिकेट को मोड़ना पड़ सकता है :

...
INSERT INTO sample (firstname, lastname)
SELECT DISTINCT firstname, lastname FROM data
...

आप CTE data . के बजाय डेटा स्रोत के रूप में (अस्थायी) तालिका का उपयोग कर सकते हैं ।

इसे (firstname, lastname) पर एक UNIQUE बाधा के साथ संयोजित करना शायद समझदारी होगी तालिका में और एक ON CONFLICT क्वेरी में क्लॉज।

संबंधित:

  • PostgreSQL में ON CONFLICT के साथ RETURNING का उपयोग कैसे करें?
  • क्या किसी ऐसे फ़ंक्शन में SELECT या INSERT है जो दौड़ की स्थिति से ग्रस्त है?


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. JDBC बैच संचालन समझ

  2. कठपुतली के साथ बर्मन को स्वचालित करना:it2ndq/barman (भाग एक)

  3. PostgreSQL में सबक्वेरी से अपडेट या इंसर्ट (एकाधिक पंक्तियाँ और कॉलम)

  4. अंतिम डाली गई पंक्ति से मूल्य कैसे प्राप्त करें?

  5. किस प्रकार के जॉइन का उपयोग करना है