¿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.

Jonas
fuente

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í

Jack Douglas
fuente
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)
Nirmal Sharma
fuente
-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;
Bhushan Chaudhary
fuente