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 ответов:
как писал Хенрик, вы можете использовать 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-целевую базу данных: Тогда,
копировать таблицу из исходной БД в целевую БД:
pg_dump -t <source_table> <source_db> | psql <target_db>
открыть приглашение psql, подключиться к target_db, и использовать простой
insert
:psql # \c <target_db>; # INSERT INTO <target_table>(id, x, y) SELECT id, x, y FROM <source_table>;
в конце удалите копию source_table что вы создали в целевая_таблица.
# DROP TABLE <source_table>;