¿Cómo insertar valores en una tabla desde una consulta de selección en PostgreSQL?


199

Tengo una mesa items (item_id serial, name varchar(10), item_group int)y una mesa items_ver (id serial, item_id int, name varchar(10), item_group int).

Ahora quiero insertar una fila items_verdesde items. ¿Hay alguna sintaxis SQL corta para hacer esto?

He intentado con:

INSERT INTO items_ver VALUES (SELECT * FROM items WHERE item_id = 2);

pero me sale un error de sintaxis:

ERROR:  syntax error at or near "select"
LINE 1: INSERT INTO items_ver VALUES (SELECT * FROM items WHERE item...

Ahora probé:

INSERT INTO items_ver SELECT * FROM items WHERE item_id = 2;

Funcionó mejor pero recibí un error:

ERROR:  column "item_group" is of type integer but expression is of type 
character varying
LINE 1: INSERT INTO items_ver SELECT * FROM items WHERE item_id = 2;

Esto puede deberse a que las columnas se definen en un orden diferente en las tablas. ¿Importa el orden de las columnas? Esperaba que PostgreSQL coincidiera con los nombres de las columnas.

Respuestas:


289

El orden de las columnas es importante, por lo tanto, si (y solo si) las órdenes de las columnas coinciden, puede, por ejemplo:

insert into items_ver
select * from items where item_id=2;

O si no coinciden, por ejemplo:

insert into items_ver(item_id, item_group, name)
select * from items where item_id=2;

pero confiar en el orden de las columnas es un error que espera suceder (puede cambiar, al igual que el número de columnas); también hace que su SQL sea más difícil de leer

No hay un buen 'acceso directo': debe enumerar explícitamente las columnas para la tabla en la que está insertando y la consulta que está utilizando para los datos de origen, por ejemplo:

insert into items_ver (item_id, name, item_group)
select item_id, name, item_group from items where item_id=2;

dbfiddle aquí


5
INSERT INTO test_import_two (name, name1, name2) 
(SELECT name, name1, name2 FROM test_import_one WHERE id = 2)

Para la misma mesa

INSERT INTO test_import_three (id1, name1, name2) 
(SELECT 216 ,name1, name2 FROM test_import_three WHERE id = 4)

-1
INSERT INTO gate_pass(
     site_id, gate_pass_element, sequence_no, createdby, createddate, lastmodifiedby, lastmodifieddate)
SELECT 1,   gatepasselement, 3, 1,now(),1,now()  
FROM unnest(string_to_array('Bhushan,Amol,pallavi', E',')) as gatepasselement;
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.