postgresql: вставить в ... (Выбрать * …)


Я не уверен, что его стандартный SQL:

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

то, что я ищу-это: что делать, если tblA и tblB находятся на разных серверах БД.

дает ли PostgreSql какую-либо утилиту или имеет какую-либо функциональность, которая поможет использовать INSERT query with PGresult struct

Я имею в виду SELECT id, time FROM tblB ... вернет a PGresult* С помощью PQexec. Можно ли использовать эту структуру в другой PQexec для выполнения команды INSERT.

EDIT:
Если это невозможно, то я пошел бы для извлечения значений из 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'); 

можно ли создать подготовленное заявление из этого!! : (

5 91

5 ответов:

как писал Хенрик, вы можете использовать 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)

PostgreSQL имеет запись псевдотип (только для аргумента функции или типа результата), который позволяет запрашивать данные из другой (неизвестной) таблицы.

Edit:

вы можете сделать это как подготовленное заявление, если хотите, и оно также работает:

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 > ;

EXECUTE migrate_data(1000);
-- DEALLOCATE migrate_data;

Edit (да, еще один):

Я только что видел ваш пересмотрен вопрос (закрыто как дубликат, или просто очень похоже на это).

Если мое понимание правильно (postgres имеет tbla и dbtest имеет tblb, и вы хотите удаленная вставка с локальным выбором, а не удаленный выбор с локальной вставкой как выше):

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, но AFAIK я не могу ссылаться на tblB в dblink_exec тело. Используйте ограничение, чтобы указать верхние 20 строк, но я думаю, что вам нужно отсортировать их с помощью Порядке, предусмотренном пунктом первым.

Если вы хотите вставить в указать столбец:

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

можно использовать dblink для создания представления, разрешенного в другой базе данных. Эта база данных может находиться на другом сервере.

это обозначение (впервые видно здесь) выглядит полезным:

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

вот альтернативное решение, без использования dblink.

предположим, что B представляет исходную базу данных, а A-целевую базу данных: Тогда,

  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 что вы создали в целевая_таблица.

    # DROP TABLE <source_table>;