2012-02-29 22 views
7

मैं Postgresql में एक आम डेटाबेस के लिए दो डेटाबेस (Database1 & Database2) विलय की एक आवश्यकता है मर्ज करें।Postgresql: 2 समान डेटाबेस

Database1

Table1

ईद - मूल्य (आईडी है प्राथमिक कुंजी)

1 - एक
2 - आ
3 - aaa
4 - aaaa

डाटाबेस 2

,210

Table1

ईद मूल्य (क्रमांक प्राथमिक कुंजी है)

2 - bb
5 - bbbbb

मैं अपने उत्पादन चाहते हैं के रूप में

OutPutDatabase

तालिका 1

ईद मूल्य (आईडी है प्राथमिक कुंजी)

1 - एक
2 - bb
3 - aaa
4 - aaaa
5 - bbbbb

मैं यह कैसे प्राप्त कर सकते हैं?

+0

आप कैसे तय कर रहे हैं कि मर्ज किए गए डेटाबेस में आईडी क्या होनी चाहिए - क्या इससे कोई फर्क पड़ता है? क्या इन तालिकाओं का संदर्भ देने वाली विदेशी कुंजी हैं, और यदि ऐसा है तो आप क्या करना चाहते हैं? –

उत्तर

3

मेरा विचार नहीं, लेकिन मैंने पहले अतीत में पढ़ा है।

The source: Move table to new database

pg_dump -d db1 -t table1 |psql db2 

then psql and do 

insert into table2 (select * from table1); 
7

सबसे पहले, उसी डेटाबेस में टेबल को दो अलग-अलग स्कीमा में लोड करें।

CREATE SCHEMA db1; 
CREATE TABLE db1.table1 (id INT PRIMARY KEY, value VARCHAR(10)); 
-- load the contents of Table1 @ Database1 into db1.table1 

CREATE SCHEMA db2; 
CREATE TABLE db2.table1 (id INT PRIMARY KEY, value VARCHAR(10)); 
-- load the contents of Table1 @ Database2 into db2.table1 

तो फिर तुम DB1 से अधिक डीबी 2 प्राथमिकता देकर दो विलय कर सकते हैं,।

SELECT 
    DISTINCT ON (id) 
    id, 
    value 
FROM (
    SELECT 
    *, 
    1 AS db 
    FROM 
    db1.table1 

    UNION 

    SELECT 
    *, 
    2 AS db 
    FROM 
    db2.table1) AS mix 
ORDER BY 
    id, 
    db DESC; 
0

मैं अलग श्रेणियों के लिए (एक ही स्कीमा लेकिन विभिन्न डेटाबेस से विभिन्न मूल्यों के साथ) एकाधिक तालिकाओं के प्राथमिक कुंजी विस्थापित करने के लिए इतना है कि मैं टेबल मर्ज कर सकते हैं migrate_pkey_sequence() समारोह here परिभाषित करते थे।

  1. डंप d1 और संबंधित फाइलों d1.sql.gz और d2.sql.gz को d2:

    यह अनुमानित अनुक्रम मैं दो डेटाबेस, d1 और d2, जिनमें से प्रत्येक एक मेज example है विलय करने के लिए पीछा किया है।

    $ pg_dump --no-owner | gzip > d1.sql.gz 
    
  2. एक स्थानीय PostgreSQL सर्वर पर एक नया, रिक्त डेटाबेस बनाएँ: यह आदेश मैं डंप करने के लिए प्रयोग किया जाता है।

  3. लोड d1.sql.gz
  4. माइग्रेट d1.example का उपयोग कर:

    # SELECT migrate_pkey_sequence('example', 'id', 'example_id_seq', 1); 
    INFO: 00000: UPDATE example SET id = nextval('example_id_seq') + 0 
    INFO: 00000: ALTER SEQUENCE example_id_seq RESTART WITH 1 
    INFO: 00000: UPDATE example SET id = DEFAULT 
    migrate_pkey_sequence 
    ----------------------- 
            4 
    (1 row) 
    
  5. रिकार्ड (इस उदाहरण में 4) मूल्य मुद्रित। यह अगले अनुक्रम की शुरुआत होगी।

  6. के रूप में ऊपर उसी तरह से फ़ाइल d1-new.sql.gz को डंप।
  7. दोहराएँ d2.sql.gz के साथ 4 के माध्यम से 2 कदम लेकिन migrate_pkey_sequence() को तर्क के रूप में 5 कदम से मूल्य का उपयोग करें: फ़ाइल d2-new-without-schema.sql.gz को

    # SELECT migrate_pkey_sequence('example', 'id', 'example_id_seq', 4); 
    
  8. डंप स्कीमा और अक्षम चलाता सहेजे बिना। यह वह आदेश है जिसका मैंने उपयोग किया:

    $ pg_dump --no-owner --data-only --disable-triggers | \ 
        gzip > d2-new-without-schema.sql.gz 
    
  9. नया, खाली डेटाबेस बनाएं।

  10. d1-new.sql.gz और d2-new-without-schema.sql.gz लोड क्रम में लोड करें। यदि सब कुछ अपेक्षित के रूप में काम करता है, तो प्राथमिक कुंजी अलग होनी चाहिए और संघर्ष नहीं होना चाहिए।

  11. डेटाबेस को डंप करें यदि आप इसे दूरस्थ सर्वर में लोड करना चाहते हैं।

संबंधित मुद्दे