Wie füge ich mehrere Werte gleichzeitig in eine Postgres-Tabelle ein?

91

Ich habe eine Tabelle, in der ich versuche, mehrere Werte gleichzeitig zu aktualisieren. Hier ist das Tabellenschema:

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

Ich habe die user_idund möchte mehrere gleichzeitig einfügen subservice_id. Gibt es eine Syntax Postgres, mit der ich so etwas machen kann?

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

Wie würde ich das machen?

jhamm
quelle
1
Wenn Sie sie aus einer Sequenz einfügen möchten oder verwenden generate_seriesSie dba.stackexchange.com/a/89544/16892
rogerdpack

Antworten:

169

Die mehrwertige Einfügesyntax lautet:

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

Aber Krokodilkos Antwort ist viel schlauer.

Scott Marlowe
quelle
Gibt es bei einer dieser Methoden eine Möglichkeit, auch die zurückzugeben id?
dvtan
2
Ja, verwenden Sie die Rückgabe. "In Tabelle (id, yada) Werte (1,2) einfügen, (9,22) ID zurückgeben;" usw.
Scott Marlowe
1
Auch heutzutage funktioniert eine CTE aka WITH-Anweisung oft gut.
Scott Marlowe
Ganzzahlige Werte können wie oben eingefügt werden. Beim Einfügen von Text mit der oben beschriebenen Methode ist jedoch keine fehlerhafte Spalte vorhanden. 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 Sie müssen einfache Anführungszeichen ' 'für den Text verwenden, den Sie einfügen. so etwas wie insert into orders_cancel_reasons_infos values (1,1,'Changed my mind',1), (2,2,'Quality not satisfactory',1)wird funktionieren. Sie können prüfen , diese für mehr heraus auf Einzel- und doppelten Anführungszeichen.
dr0pdb
23

Eine kürzere Version von Krokodilkos Antwort:

insert into user_subservices(user_id, subservice_id) 
values(1, unnest(array[1, 2, 3]));
yallie
quelle
Ich denke, dies ist mehr Ausdruck der Absicht als die akzeptierte Antwort. Ist dies Standard-SQL oder PostgreSQL-spezifisch?
Bernard
3
Beide Antworten sind PostgreSQL-spezifisch. Die akzeptierte Antwort lässt sich möglicherweise leichter in andere Datenbanken übersetzen, z. B. Oracle : insert into user_subservices(user_id, subservice_id) select 1, column_value from table(sys.odcinumberlist(1,2,3)).
Yallie
Danke, das macht viel mehr Sinn und ist meiner Meinung nach besser lesbar als die akzeptierte Antwort.
Frosty
1
Eine Möglichkeit, dies mit Informationen aus einer anderen Tabelle zu verwenden: insert into user_subservices(user_id, subservice_id) values(1, unnest(ARRAY(select id from subservices where name like '%test%')));
Efren
11

Eine leicht verwandte Antwort, da ich diese Frage jedes Mal finde, wenn ich versuche, mich an diese Lösung zu erinnern. Fügen Sie mehrere Zeilen mit mehreren Spalten ein :

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

Robusteres Beispiel, wenn Sie für jede Zeile in einer anderen Tabelle mehrere Zeilen in eine Tabelle einfügen müssen:

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
quelle