¿Cómo inserto varios valores en una tabla de postgres a la vez?

93

Tengo una tabla en la que estoy tratando de actualizar varios valores a la vez. Aquí está el esquema de la tabla:

    Column     |  Type   | Modifiers 
---------------+---------+-----------
 user_id       | integer | 
 subservice_id | integer |

Tengo el user_idy quiero insertar varios subservice_ida la vez. ¿Hay alguna sintaxis Postgresque me permita hacer algo como esto?

insert into user_subservices(user_id, subservice_id) values(1, [1, 2, 3]);

¿Cómo haría esto?

jhamm
fuente
1
Si desea insertarlos desde una secuencia, o usarlos, generate_seriesconsulte dba.stackexchange.com/a/89544/16892
rogerdpack

Respuestas:

172

La sintaxis de inserción de varios valores es:

insert into table values (1,1), (1,2), (1,3), (2,1);

Pero la respuesta de krokodilko es mucho más hábil.

Scott Marlowe
fuente
Con cualquiera de estos métodos, ¿hay alguna forma de devolver también el id?
dvtan
2
Sí, usa la devolución. "insertar en la tabla (id, yada) valores (1,2), (9,22) devolviendo id;" etc
Scott Marlowe
1
Además, hoy en día, una declaración CTE, también conocida como WITH, a menudo funciona bien.
Scott Marlowe
Los valores enteros se pueden insertar como arriba. Pero al insertar texto usando el método anterior, aparece un error como si la columna no existe. insert into orders_cancel_reasons_infos values (1,1,"Changed my mind",1), (2,2,"Quality not satisfactory",1), (3,3,"Incompatible or not useful",1), (4,4,"Damaged product but shipping box is good",1), (5,5,"Items arrived too late",1), (6,6,"Missing part or accessories",1), (7,7,"Product and shipping box are damaged",1), (8,8,"Wrong item was sent",1), (9,9,"Defective item",1), (10,10,"Inaccurate description",1), (11,11,"Other",1);
sankar muniyappa
@sankarmuniyappa tendrá que usar comillas simples ' 'para el texto que está insertando. así que algo como, insert into orders_cancel_reasons_infos values (1,1,'Changed my mind',1), (2,2,'Quality not satisfactory',1)funcionará. Puede consultar esto para obtener más información sobre las comillas simples y dobles.
dr0pdb
25

Una versión más corta de la respuesta de krokodilko:

insert into user_subservices(user_id, subservice_id) 
values(1, unnest(array[1, 2, 3]));
yallie
fuente
Creo que esto expresa más la intención que la respuesta aceptada. ¿Es este estándar SQL o específico de PostgreSQL?
Bernard
3
Ambas respuestas son específicas de PostgreSQL. La respuesta aceptada es quizás más fácilmente traducido a otras bases de datos, Oracle, por ejemplo: insert into user_subservices(user_id, subservice_id) select 1, column_value from table(sys.odcinumberlist(1,2,3)).
yallie
Gracias, esto tiene mucho más sentido y es más legible que la respuesta aceptada en mi opinión.
helado
1
Una forma de usar esto con información de otra tabla: insert into user_subservices(user_id, subservice_id) values(1, unnest(ARRAY(select id from subservices where name like '%test%')));
Efren
12

Una respuesta ligeramente relacionada porque sigo encontrando esta pregunta cada vez que trato de recordar esta solución. Inserte varias filas con varias columnas :

insert into user_subservices (user_id, subservice_id)
select *
from unnest(array[1, 2], array[3, 4]);
Andreas Hultgren
fuente
3

Ejemplo más sólido, para cuando necesita insertar varias filas en una tabla para cada fila en otra tabla:

INSERT INTO user_subservices (user_id, subservice_id)
SELECT users.id AS user_id, subservice_id
FROM users
CROSS JOIN unnest(ARRAY[1,2,3]) subservice_id;
Envek
fuente