web-dev-qa-db-fra.com

Comment insérer plusieurs valeurs dans une table postgres à la fois?

J'ai une table que j'essaye de mettre à jour plusieurs valeurs à la fois. Voici le schéma de la table:

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

J'ai le user_id et que vous souhaitez insérer plusieurs subservice_id est à la fois. Y a-t-il une syntaxe dans Postgres qui me permette de faire quelque chose comme ceci

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

Comment je ferais ça?

72
jhamm

Essayer:

INSERT INTO user_subservices(user_id, subservice_id) 
SELECT 1 id, x
FROM    unnest(ARRAY[1,2,3,4,5,6,7,8,22,33]) x

Démo: http://www.sqlfiddle.com/#!15/9a006/1

48
krokodilko

La syntaxe d'insertion à valeurs multiples est la suivante:

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

Mais la réponse de Krokodilko est beaucoup plus subtile.

145
Scott Marlowe

Une version plus courte de la réponse de krokodilko:

insert into user_subservices(user_id, subservice_id) 
values(1, unnest(array[1, 2, 3]));
19
yallie

Une réponse légèrement liée car je continue à trouver cette question chaque fois que j'essaie de me souvenir de cette solution. Insérer plusieurs lignes avec plusieurs colonnes:

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

Exemple plus robuste, lorsque vous devez insérer plusieurs lignes dans une table pour chaque ligne d’une autre table:

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;
1
Envek