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

पोस्टग्रेज़ के साथ डेटा डालें और विदेशी कुंजियाँ सेट करें

तालिका users कुछ प्राथमिक कुंजी . होनी चाहिए कि आपने खुलासा नहीं किया। इस उत्तर के प्रयोजन के लिए मैं इसे users_id नाम दूंगा ।

आप इसे डेटा-संशोधित CTEs . के साथ बल्कि सुरुचिपूर्ण ढंग से हल कर सकते हैं PostgreSQL के साथ पेश किया गया 9.1 :

country अद्वितीय है

इस मामले में पूरा ऑपरेशन काफी मामूली है:

WITH i AS (
    INSERT INTO addresses (country) 
    SELECT country
    FROM   users
    WHERE  address_id IS NULL 
    RETURNING id, country
    )
UPDATE users u
SET    address_id = i.id
FROM   i
WHERE  i.country = u.country;

आप संस्करण का उल्लेख करते हैं 8.3 आपके प्रश्न में। उन्नत करना! पोस्टग्रेज 8.3 जीवन के अंत तक पहुंच गया है।

जैसा कि हो सकता है, यह संस्करण 8.3 के साथ काफी सरल है। आपको बस दो कथन चाहिए:

INSERT INTO addresses (country) 
SELECT country
FROM   users
WHERE  address_id IS NULL;

UPDATE users u
SET    address_id = a.id
FROM   addresses a
WHERE  address_id IS NULL 
AND    a.country = u.country;

country अद्वितीय नहीं है

यह अधिक चुनौतीपूर्ण है। आप कर सकते थे बस एक पता बनाएं और उसे कई बार लिंक करें। लेकिन आपने एक 1:1 संबंध का उल्लेख किया है जो इस तरह के एक सुविधाजनक समाधान से इंकार करता है।

WITH s AS (
    SELECT users_id, country
         , row_number() OVER (PARTITION BY country) AS rn
    FROM   users
    WHERE  address_id IS NULL 
    )
    , i AS (
    INSERT INTO addresses (country) 
    SELECT country
    FROM   s
    RETURNING id, country
    )
    , r AS (
    SELECT *
         , row_number() OVER (PARTITION BY country) AS rn
    FROM   i
    )
UPDATE users u
SET    address_id = r.id
FROM   r
JOIN   s USING (country, rn)    -- select exactly one id for every user
WHERE  u.users_id = s.users_id
AND    u.address_id IS NULL;

चूंकि एक id को स्पष्ट रूप से निर्दिष्ट करने का कोई तरीका नहीं है INSERT . से लौटा समान country . वाले सेट में प्रत्येक उपयोगकर्ता के लिए , मैं विंडो फ़ंक्शन का उपयोग करता हूं row_number() उन्हें अद्वितीय बनाने के लिए।

पोस्टग्रेस 8.3 . के साथ उतना सीधा नहीं है . एक संभावित तरीका:

INSERT INTO addresses (country) 
SELECT DISTINCT country -- pick just one per set of dupes
FROM   users
WHERE  address_id IS NULL;

UPDATE users u
SET    address_id = a.id
FROM   addresses a
WHERE  a.country = u.country
AND    u.address_id IS NULL
AND NOT EXISTS (
    SELECT * FROM addresses b
    WHERE  b.country = a.country
    AND    b.users_id < a.users_id
    ); -- effectively picking the smallest users_id per set of dupes

इसे दोहराएं अंतिम NULL . तक मान users.address_id से चला गया है ।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. पोस्टग्रेज JSON डेटा प्रकार रेल क्वेरी

  2. Postgres में बल्क इंसर्ट करने का सबसे तेज़ तरीका क्या है?

  3. PostgreSQL के लिए शीर्ष GUI उपकरण

  4. वॉल्यूम का उपयोग करके डॉक किए गए पोस्टग्रेज डेटाबेस में डेटा को कैसे बनाए रखें

  5. PhpPgAdmin का उपयोग करके PostgreSQL डेटाबेस कैसे आयात करें