Come si inseriscono più valori contemporaneamente in una tabella postgres?


93

Ho una tabella che sto cercando di aggiornare più valori contemporaneamente. Ecco lo schema della tabella:

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

Ho user_ide desidero inserire più subservice_iddi un file contemporaneamente. C'è una sintassi Postgresche mi permetterà di fare qualcosa di simile

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

Come lo farei?


1
Se vuoi inserirli da una sequenza, o usando generate_seriesvedi dba.stackexchange.com/a/89544/16892
rogerdpack

Risposte:



172

La sintassi dell'inserimento multivalore è:

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

Ma la risposta di Krokodilko è molto più sfacciata.


Con uno di questi metodi, c'è un modo per restituire anche il id?
dvtan

2
Sì, usa la restituzione. "inserire nella tabella (id, yada) i valori (1,2), (9,22) restituendo id;" ecc
Scott Marlowe

1
Anche al giorno d'oggi una dichiarazione CTE aka WITH spesso funziona bene.
Scott Marlowe

I valori interi possono essere inseriti come sopra. Ma durante l'inserimento del testo utilizzando il metodo sopra riportato, non esiste un errore come la colonna. 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 dovrai usare virgolette singole ' 'per il testo che stai inserendo. quindi qualcosa come, insert into orders_cancel_reasons_infos values (1,1,'Changed my mind',1), (2,2,'Quality not satisfactory',1)funzionerà. Puoi controllare questo per ulteriori informazioni su virgolette singole e doppie.
dr0pdb

25

Una versione più breve della risposta di krokodilko:

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

Penso che questo sia più espressivo di intenti rispetto alla risposta accettata. Questo standard SQL o PostgreSQL è specifico?
Bernard

3
Entrambe le risposte sono specifiche di PostgreSQL. La risposta accettata è forse più facilmente tradotta in altri database, Oracle ad esempio: insert into user_subservices(user_id, subservice_id) select 1, column_value from table(sys.odcinumberlist(1,2,3)).
yallie

Grazie, questo ha molto più senso ed è più leggibile della risposta accettata secondo me.
gelido

1
Un modo per usarlo con le informazioni di un'altra tabella: insert into user_subservices(user_id, subservice_id) values(1, unnest(ARRAY(select id from subservices where name like '%test%')));
Efren

12

Una risposta leggermente correlata perché continuo a trovare questa domanda ogni volta che cerco di ricordare questa soluzione. Inserisci più righe con più colonne :

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

3

Esempio più robusto, per quando è necessario inserire più righe in una tabella per ogni riga in un'altra tabella:

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;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.