Postgresql: INSERT INTO... (SELECT *...)
Я не уверен, что его стандартный 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');
Можно ли создать подготовленное выражение из этого!: (
Ответы
Ответ 1
Как писал Хенрик, вы можете использовать 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 > $1;
EXECUTE migrate_data(1000);
-- DEALLOCATE migrate_data;
Изменить (да, другое):
Я только что видел ваш пересмотренный вопрос (закрыт как дубликат или просто очень похож на этот).
Если мое понимание правильное (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 body. Используйте LIMIT, чтобы указать верхние 20 строк, но я думаю, вам нужно отсортировать их, используя предложение ORDER BY.
Ответ 2
Если вы хотите вставить в столбец опций:
INSERT INTO table (time)
(SELECT time FROM
dblink('dbname=dbtest', 'SELECT time FROM tblB') AS t(time integer)
WHERE time > 1000
);
Ответ 3
Вы можете использовать dblink для создания представления, которое разрешено в другой базе данных. Эта база данных может находиться на другом сервере.
Ответ 4
Эта запись (впервые увиденная здесь) также выглядит полезной:
insert into postagem (
resumopostagem,
textopostagem,
dtliberacaopostagem,
idmediaimgpostagem,
idcatolico,
idminisermao,
idtipopostagem
) select
resumominisermao,
textominisermao,
diaminisermao,
idmediaimgminisermao,
idcatolico ,
idminisermao,
1
from
minisermao
Ответ 5
Здесь альтернативное решение, без использования 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, которую вы создали в target_table.
# DROP TABLE <source_table>;
Ответ 6
insert into TABLENAMEA (A,B,C,D)
select A::integer,B,C,D from TABLENAMEB