Je ne suis pas sûr si son SQL standard:
INSERT INTO tblA
(SELECT id, time
FROM tblB
WHERE time > 1000)
Ce que je recherche, c’est: que se passe-t-il si tblA et tblB se trouvent dans différents serveurs de base de données .
Est-ce que PostgreSql donne un utilitaire ou a une fonctionnalité qui vous aidera à utiliser INSERT query with PGresult struct
Je veux dire que SELECT id, time FROM tblB ...
renverra un PGresult*
après avoir utilisé PQexec
. Est-il possible d'utiliser cette structure dans une autre variable PQexec
pour exécuter une commande INSERT.
MODIFIER:
Si ce n’est pas possible, j’aimerais extraire les valeurs de PQresult * et créer une syntaxe multiple pour les instructions INSERT, telle que:
INSERT INTO films (code, title, did, date_prod, kind) VALUES
('B6717', 'Tampopo', 110, '1985-02-10', 'Comedy'),
('HG120', 'The Dinner Game', 140, DEFAULT, 'Comedy');
Est-il possible de créer une déclaration préparée à partir de cela! :(
Comme Henrik l'a écrit, vous pouvez utiliser dblink pour connecter une base de données distante et récupérer le résultat. Par exemple:
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 a record pseudo-type (uniquement pour l’argument de la fonction ou le type de résultat), ce qui vous permet d’interroger les données d’une autre table (inconnue).
Modifier:
Vous pouvez en faire une déclaration préparée si vous le souhaitez et cela fonctionne également:
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;
Edit (ouais, un autre):
Je viens de voir votre question révisée (fermée en double ou très similaire à celle-ci).
Si ma compréhension est correcte (postgres a tbla et dbtest a tblb et vous voulez insert distant avec sélection locale, pas remote select avec insertion locale comme ci-dessus):
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;'
);
Je n'aime pas ce dblink imbriqué, mais autant que je sache, je ne peux pas faire référence à tblB dans dblink_exec body. Utilisez LIMIT pour spécifier les 20 premières lignes, mais je pense que vous devez d'abord les trier à l'aide de la clause ORDER BY.
Si vous souhaitez insérer dans la colonne spécifiée:
INSERT INTO table (time)
(SELECT time FROM
dblink('dbname=dbtest', 'SELECT time FROM tblB') AS t(time integer)
WHERE time > 1000
);
Vous pouvez utiliser dblink pour créer une vue résolue dans une autre base de données. Cette base de données peut être sur un autre serveur.
Cette notation (vue pour la première fois ici ) semble également utile:
insert into postagem (
resumopostagem,
textopostagem,
dtliberacaopostagem,
idmediaimgpostagem,
idcatolico,
idminisermao,
idtipopostagem
) select
resumominisermao,
textominisermao,
diaminisermao,
idmediaimgminisermao,
idcatolico ,
idminisermao,
1
from
minisermao
Voici une solution alternative, sans utiliserdblink
.
Supposons que B représente la base de données source et A représente la base de données cible: Ensuite,
Copier la table de la base de données source vers la base de données cible:
pg_dump -t <source_table> <source_db> | psql <target_db>
Ouvrez l'invite psql, connectez-vous à target_db et utilisez un simple insert
:
psql
# \c <target_db>;
# INSERT INTO <target_table>(id, x, y) SELECT id, x, y FROM <source_table>;
A la fin, supprimez la copie de source_table que vous avez créée dans target_table.
# DROP TABLE <source_table>;
insert into TABLENAMEA (A,B,C,D)
select A::integer,B,C,D from TABLENAMEB