No estoy seguro de si es SQL estándar:
INSERT INTO tblA
(SELECT id, time
FROM tblB
WHERE time > 1000)
Lo que estoy buscando es: ¿qué pasa si tblA y tblB están en diferentes servidores DB ?
¿PostgreSql ofrece alguna utilidad o tiene alguna funcionalidad que ayude a usar? INSERT query with PGresult struct
Quiero decir SELECT id, time FROM tblB ...
, volveré PGresult*
a usar PQexec
. ¿Es posible usar esta estructura en otra PQexec
para ejecutar un comando INSERT?
EDITAR:
Si no es posible, iría a extraer los valores de PQresult * y crearía una sintaxis de declaración INSERT múltiple como:
INSERT INTO films (code, title, did, date_prod, kind) VALUES
('B6717', 'Tampopo', 110, '1985-02-10', 'Comedy'),
('HG120', 'The Dinner Game', 140, DEFAULT, 'Comedy');
¿Es posible crear una declaración preparada a partir de esto? :(
sql
postgresql
insert
dblink
Mayank
fuente
fuente
Respuestas:
Como escribió Henrik, puede usar dblink para conectar la base de datos remota y obtener el resultado. Por ejemplo:
PostgreSQL tiene un pseudo-tipo de registro (solo para el argumento de la función o el tipo de resultado), que le permite consultar datos de otra tabla (desconocida).
Editar:
Puede hacerlo como una declaración preparada si lo desea y también funciona:
Editar (sí, otro):
Acabo de ver su pregunta revisada (cerrada como duplicada o simplemente muy similar a esta).
Si mi entendimiento es correcto (postgres tiene tbla y dbtest tiene tblb y desea una inserción remota con selección local , no selección remota con inserción local como arriba):
No me gusta ese dblink anidado, pero AFAIK, no puedo hacer referencia a tblB en el cuerpo dblink_exec . Use LIMIT para especificar las 20 filas superiores, pero creo que primero debe ordenarlas usando la cláusula ORDER BY.
fuente
INSERT INTO tblA SELECT id, time FROM dblink('dbname=dbtest', 'SELECT id, time FROM tblB') AS t(id integer, time integer) WHERE time > 1000;
¿Puedo hacer una declaración preparada sobre esto?Si desea insertar en la columna especificada:
fuente
Puede utilizar dblink para crear una vista que se resuelve en otra base de datos. Esta base de datos puede estar en otro servidor.
fuente
INSERT INTO ... (SELECT FROM ...)
funcionará el uso de dblink. Lo que necesito esINSERT INTO ...
ejecutar una sesión dblink en otro servidor DB, pero(SELECT FROM ...)
en mi sesión actual.Esta notación (vista por primera vez aquí ) también parece útil:
fuente
fuente
Aquí hay una solución alternativa, sin usar
dblink
.Suponga que B representa la base de datos de origen y A representa la base de datos de destino: Entonces,
Copie la tabla de la base de datos de origen a la base de datos de destino:
Abra el indicador psql, conéctese a target_db y use un simple
insert
:Al final, elimine la copia de source_table que creó en target_table .
fuente