postgresql: insérer dans ... (sélectionner * …)
Je ne suis pas sûr si son SQL standard:
INSERT INTO tblA
(SELECT id, time
FROM tblB
WHERE time > 1000)
ce que je cherche est: et si tblA et tblB sont dans des serveurs DB différents .
PostgreSql donne aucune utilité ou a toutes les fonctionnalités qui vous aideront à utiliser INSERT query with PGresult struct
je veux dire SELECT id, time FROM tblB ...
sera de retour d'une PGresult*
sur l'utilisation de PQexec
. Est-il possible d'utiliser cette structure dans un autre PQexec
pour exécuter un INSERT command.
EDIT:
Si ce n'est pas possible, j'opterais pour l'extraction des valeurs de PQresult* et je créerais une syntaxe D'énoncé D'insertion multiple comme:
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 à l'avance!! : (
5 réponses
comme Henrik a écrit, Vous pouvez utiliser dblink pour connecter la base de données à distance 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 (seulement pour l'argument de la fonction ou le type de résultat), qui vous permet d'interroger des données à partir d'une autre table (inconnue).
Edit:
vous pouvez le faire comme déclaration préparée si vous voulez et il fonctionne aussi bien:
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 (ouais, un autre):
je viens de voir votre question révisée (fermée en duplicata, ou tout simplement très similaire à celui-ci).
si ma compréhension est correcte (postgres a tbla et dbtest a tblb et vous voulez insertion à distance avec local sélectionner , pas sélection à distance avec local insérer 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 AFAIK Je ne peux pas référence à tblB dans dblink_exec body. Utilisez LIMIT pour spécifier les 20 premières lignes, mais je pense que vous devez les trier en utilisant ordre Par clause d'abord.
si vous voulez insérer dans la colonne spécifier:
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 qui est résolu 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 utile aussi:
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 utiliser dblink
.
supposons que B représente la base de données source et que A représente la base de données cible: Puis,
-
Copie de la table de base de données source à la cible DB:
pg_dump -t <source_table> <source_db> | psql <target_db>
-
ouvrir l'invite psql, se connecter à target_db , et utiliser un simple
insert
:psql # \c <target_db>; # INSERT INTO <target_table>(id, x, y) SELECT id, x, y FROM <source_table>;
-
à la fin, supprimer la copie de source_table que vous avez créé dans target_table .
# DROP TABLE <source_table>;