পোস্টগ্র্যাস্কল: অন্তর্ভুক্ত করুন… (নির্বাচন করুন…)


124

আমি নিশ্চিত নই যে এর স্ট্যান্ডার্ড এসকিউএল:

 INSERT INTO tblA 
 (SELECT id, time 
    FROM tblB 
   WHERE time > 1000)  

আমি যা খুঁজছি তা হ'ল: যদি টিবিএলএ এবং টিবিএলবি বিভিন্ন ডিবি সার্ভারে থাকে

পোস্টগ্রেএসকিএল কি কোনও ইউটিলিটি দেয় বা এমন কোনও কার্যকারিতা রয়েছে যা ব্যবহার করতে সহায়তা করবে INSERT query with PGresult struct

আমি মানে SELECT id, time FROM tblB ...একটি ফিরে আসবে PGresult*ব্যবহার করে PQexecPQexecকোনও INSERT কমান্ড কার্যকর করতে এই কাঠামোটি অন্য কোনওটিতে ব্যবহার করা কি সম্ভব ?

সম্পাদনা:
যদি সম্ভব না হয় তবে আমি PQresult * থেকে মানগুলি বের করতে যাব এবং একাধিক INSERT বিবৃতি বাক্য গঠন তৈরি করব:

INSERT INTO films (code, title, did, date_prod, kind) VALUES
    ('B6717', 'Tampopo', 110, '1985-02-10', 'Comedy'),
    ('HG120', 'The Dinner Game', 140, DEFAULT, 'Comedy'); 

এর বাইরে কি কোনও প্রস্তুত বিবৃতি তৈরি করা সম্ভব !! :(


আপনার পোস্ট করা INSERT সিনট্যাক্সটি এএনএসআই কিনা তা আমি জানি না তবে এটি ব্যাপকভাবে সমর্থিত (ওরাকল, মাইএসকিউএল, এসকিউএল সার্ভার, এসকিউএলাইট ...)। কিন্তু বন্ধনী প্রয়োজন হয় না।
ওএমজি পনিজ

উত্তর:


151

হেনরিক যেমন লিখেছেন আপনি রিমোট ডাটাবেস সংযোগ করতে এবং ফলাফল আনতে dblink ব্যবহার করতে পারেন। উদাহরণ স্বরূপ:

psql dbtest
CREATE TABLE tblB (id serial, time integer);
INSERT INTO tblB (time) VALUES (5000), (2000);

psql postgres
CREATE TABLE tblA (id serial, time integer);

INSERT INTO tblA
    SELECT id, time 
    FROM dblink('dbname=dbtest', 'SELECT id, time FROM tblB')
    AS t(id integer, time integer)
    WHERE time > 1000;

TABLE tblA;
 id | time 
----+------
  1 | 5000
  2 | 2000
(2 rows)

পোস্টগ্রিসকিউএল রেকর্ড সিউডো-টাইপ (কেবল ফাংশনের যুক্তি বা ফলাফলের ধরণের জন্য) রয়েছে যা আপনাকে অন্য (অজানা) সারণী থেকে ডেটা জিজ্ঞাসা করতে দেয়।

সম্পাদনা:

আপনি চাইলে এটি প্রস্তুত বিবৃতি হিসাবে তৈরি করতে পারেন এবং এটি কাজ করেও:

PREPARE migrate_data (integer) AS
INSERT INTO tblA
    SELECT id, time
    FROM dblink('dbname=dbtest', 'SELECT id, time FROM tblB')
    AS t(id integer, time integer)
    WHERE time > $1;

EXECUTE migrate_data(1000);
-- DEALLOCATE migrate_data;

সম্পাদনা করুন (হ্যাঁ, অন্য):

আমি কেবল আপনার সংশোধিত প্রশ্নটি দেখেছি (সদৃশ হিসাবে বন্ধ হয়েছে, বা এর সাথে খুব মিল)।

যদি আমার বোধগম্যতা সঠিক হয় (পোস্টগ্রিসের টিবিলা রয়েছে এবং ডিবেস্টে টিবিএলবি রয়েছে এবং আপনি স্থানীয় নির্বাচন সহ দূরবর্তী সন্নিবেশ চান , উপরের মতো স্থানীয় সন্নিবেশ সহ দূরবর্তী নির্বাচন নয় ):

psql dbtest

SELECT dblink_exec
(
    'dbname=postgres',
    'INSERT INTO tbla
        SELECT id, time
        FROM dblink
        (
            ''dbname=dbtest'',
            ''SELECT id, time FROM tblb''
        )
        AS t(id integer, time integer)
        WHERE time > 1000;'
);

আমি সেই নেস্টেড ডিবিলিঙ্কটি পছন্দ করি না, তবে এএএফআইকে আমি dblink_exec বডিতে টিবিএলবি- উল্লেখ করতে পারি না । শীর্ষ 20 টি সারি নির্দিষ্ট করতে LIMIT টি ব্যবহার করুন, তবে আমার মনে হয় আপনার প্রথমে শৃঙ্খলা দ্বারা আদেশটি ব্যবহার করে বাছাই করা দরকার।


1
আপনার প্রতিক্রিয়ার জন্য ধন্যবাদ. ঠিক আছে, আরও একটি তাত্ক্ষণিক প্রশ্ন ... INSERT INTO tblA SELECT id, time FROM dblink('dbname=dbtest', 'SELECT id, time FROM tblB') AS t(id integer, time integer) WHERE time > 1000; আমি কি এর বাইরে একটি প্রস্তুত বিবৃতি দিতে পারি?
মায়াঙ্ক

হাই @ গ্রজেগোর্জ-এস্পেটকোভস্কি, এই যুক্তিটি ত্রুটি দিচ্ছে: ত্রুটি: পাসওয়ার্ড প্রয়োজন বিশদ: অ-সুপারयूজারদের অবশ্যই সংযোগের স্ট্রিংয়ে একটি পাসওয়ার্ড সরবরাহ করতে হবে।
নীল দারজি


9

আপনি অন্য ডেটাবেজে সমাধান হওয়া ভিউ তৈরি করতে dblink ব্যবহার করতে পারেন । এই ডাটাবেস অন্য সার্ভারে থাকতে পারে।


উত্তরের জন্য ধন্যবাদ. তবে INSERT INTO ... (SELECT FROM ...)ডিবিলিঙ্ক ব্যবহার করে কীভাবে কাজ করবে তা আমি পাইনি । আমার যা দরকার তা হল INSERT INTO ...ডিবিলিঙ্ক সেশনে অন্যান্য ডিবি সার্ভারে চালানো, তবে (SELECT FROM ...)আমার বর্তমান সেশনে।
মায়াঙ্ক

আপনি কেবল টিবিএলএর সংজ্ঞা হিসাবে ডিব্লিংক দ্বারা সমর্থনযুক্ত হিসাবে সংজ্ঞায়িত করেন। সুতরাং সন্নিবেশ, আপডেট, মুছে ফেলা অন্যান্য ডাটাবেসে করা হবে। dblink কেবল পঠনযোগ্য নয়।
হেন্ডরিক ব্রুমারম্যান

9

এই স্বরলিপিটি ( এখানে প্রথম দেখানো )ও দরকারী মনে হচ্ছে:

insert into postagem (
  resumopostagem,
  textopostagem,
  dtliberacaopostagem,
  idmediaimgpostagem,
  idcatolico,
  idminisermao,
  idtipopostagem
) select
  resumominisermao,
  textominisermao,
  diaminisermao,
  idmediaimgminisermao,
  idcatolico ,
  idminisermao,
  1
from
  minisermao    

2
টেবিলগুলি একই ডাটাবেসে থাকা অবস্থায় এটি কেবল তখনই কাজ করে। প্রশ্নটি একটি আলাদা ডাটাবেসে একটি টেবিল থেকে ডেটা অনুলিপি করার বিষয়ে ।
নীতিন নাইন


1

ব্যবহার না করেই এখানে বিকল্প সমাধান রয়েছে dblink

ধরুন, বি উত্স ডাটাবেসকে উপস্থাপন করে এবং এ লক্ষ্য ডাটাবেসের প্রতিনিধিত্ব করে: তারপরে,

  1. উত্স ডিবি থেকে ডিবি লক্ষ্য করে টেবিল অনুলিপি করুন:

    pg_dump -t <source_table> <source_db> | psql <target_db>
  2. ওপেন psql প্রম্পট সাথে সংযোগ target_db , এবং একটি সহজ ব্যবহার insert:

    psql
    # \c <target_db>;
    # INSERT INTO <target_table>(id, x, y) SELECT id, x, y FROM <source_table>;
  3. শেষে, কপি মুছতে source_table যাতে আপনি সম্ভবত নির্মিত target_table

    # DROP TABLE <source_table>;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.