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!! : (

91
demandé sur Mayank 2011-05-21 20:50:36

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.

114
répondu Grzegorz Szpetkowski 2017-05-23 12:26:33

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
);
19
répondu Piotr Olaszewski 2015-02-02 13:08:06

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.

9
répondu Hendrik Brummermann 2011-05-21 17:17:18

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    
2
répondu Sombriks 2018-02-07 00:16:50

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,

  1. Copie de la table de base de données source à la cible DB:

    pg_dump -t <source_table> <source_db> | psql <target_db>
    
  2. 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>;
    
  3. à la fin, supprimer la copie de source_table que vous avez créé dans target_table .

    # DROP TABLE <source_table>;
    
1
répondu Nitin Nain 2018-07-29 05:19:49