Inserimento di più righe in una singola query SQL?


1,212

Ho più serie di dati da inserire contemporaneamente, diciamo 4 righe. La mia tabella ha tre colonne: Person, Id e Office.

INSERT INTO MyTable VALUES ("John", 123, "Lloyds Office"); 
INSERT INTO MyTable VALUES ("Jane", 124, "Lloyds Office"); 
INSERT INTO MyTable VALUES ("Billy", 125, "London Office"); 
INSERT INTO MyTable VALUES ("Miranda", 126, "Bristol Office"); 

Posso inserire tutte e 4 le righe in una singola istruzione SQL?

+3

** ** Moderatore Nota: Si prega di prendere ogni discussione sui meriti di questa domanda a [questa meta post] (http://meta.stackexchange.com/questions/ 194313/perché-was-inserimento-più-righe-in-a-single-sql-query-chiuso). 22 ago. 132013-08-22 13:39:20

+2

Per oracle sql vedere http://stackoverflow.com/a/93724/1452172 26 giu. 142014-06-26 11:20:34

  0

utilizzare add.batch dude 18 set. 142014-09-18 09:57:27

  0

Per inserire più record in una riga puoi provare anche questo Esempio: inserisci in tablename (col1, col2) seleziona uid, uname da usertable; 04 mar. 152015-03-04 12:35:27

  0

è inoltre possibile utilizzare questa query per inserire più righe in una singola query SQL. ecco la query: INSERIRE in tablename1 (Person, Id, Office) SELECT 'John', 1, 'Lloyds Office' UNION SELECT 'Jane', 2, 'Lloyds Office' UNION SELECT 'Billy', 3, 'Lloyds Office' UNION SELECT 'Miranda', 4, 'Lloyds Office' 19 ott. 162016-10-19 06:02:31

  0

Per quanto posso dire, il nome di questa tecnica non è specifico, basta inserire più righe, per coloro che desiderano essere in grado di riferirsi alla tecnica concettualmente. Rif: https://dev.mysql.com/doc/refman/5.5/en/insert.html 28 dic. 162016-12-28 22:45:23

  0

@Kzqai, che dire di 'insert set col1 = 'val1', col2 = 'val2 (?) Col1 =' val3 ' , col2 = val2'' in/per [tag: mysql]? Intendo inserire più righe con la sintassi 'insert set' specifica per mysql; È possibile? 10 set. 172017-09-10 11:27:04

+1

@ Chinggis6 Sì, banalmente possibile, basta usare una selezione per i valori della colonna: 11 set. 172017-09-11 17:24:43

  0

@Kzqai potresti fornire un esempio per favore? 11 set. 172017-09-11 18:18:46

+1

@ Chinggis6 '' 'inserisci nei profili (nome, descrizione) seleziona prima, 'Generato automaticamente' dagli utenti ''' Sembra che tu stia confondendo le istruzioni di inserimento e aggiornamento, che sono bestie diverse. 11 set. 172017-09-11 21:21:31

  0

@ Kzqai No. Si prega di ricontrollare il collegamento che hai fornito sopra. MySQL, diversamente dagli altri DB, ti permette di usare 'insert' nella modalità' update' con 'set' piuttosto che' values'. È un'istruzione SQL non standard specifica per MySQL. 11 set. 172017-09-11 21:26:00

+1

@ Chinggis6 Ah capisco. Beh, mi limito a utilizzare lo standard '' 'inserisci ...seleziona la sintassi''', ti darà tutto ciò di cui hai bisogno ed è flessibile come si può desiderare. https://dev.mysql.com/doc/refman/5.5/en/insert.html 12 set. 172017-09-12 13:43:14

641

Se si sta inserendo in un'unica tabella, è possibile scrivere la query come questo (forse solo in MySQL):

INSERT INTO table1 (First, Last) 
VALUES 
    ('Fred', 'Smith'), 
    ('John', 'Smith'), 
    ('Michael', 'Smith'), 
    ('Robert', 'Smith'); 
+45

A partire da SQL Server 2008, questo funzionerà se si sostituiscono le virgolette doppie con quelle singole. 22 mar. 122012-03-22 13:37:41

+6

Funziona anche con postgres v9.0 13 nov. 132013-11-13 10:19:24

+7

E con SQLite 09 dic. 132013-12-09 10:13:07

+4

Solo SQLite 3.7.11 in poi. Se non puoi garantire che, utilizzare il metodo UNION mostrato qui: http://stackoverflow.com/a/5009740/841830 13 feb. 142014-02-13 01:12:58

  0

c'è qualche limite sui valori? come se avessi molti record su come gestire questa situazione? 28 set. 152015-09-28 07:32:37

  0

Non funziona in MS SQL DataWarehouse 25 ott. 162016-10-25 03:58:44

  0

Ha funzionato correttamente in SQL Server 2012. 22 feb. 182018-02-22 17:52:21

  0

Muneem, il limite è di 1.000 righe VALUE per istruzione INSERT. 22 feb. 182018-02-22 18:02:45


105

NOTA: Questa risposta è per SQL Server 2005. Per SQL Server 2008 e più tardi, ci sono metodi molto migliori, come si vede nelle altre risposte.

È possibile utilizzare INSERT with SELECT UNION ALL:

INSERT INTO MyTable (FirstCol, SecondCol) 
    SELECT 'First' ,1 
    UNION ALL 
SELECT 'Second' ,2 
    UNION ALL 
SELECT 'Third' ,3 
... 

Solo per i piccoli insiemi di dati, però, che dovrebbe andare bene per i vostri 4 record.


1,618

In SQL Server 2008 è possibile inserire più righe utilizzando un'unica istruzione SQL INSERT.

INSERT INTO MyTable (Column1, Column2) VALUES 
(Value1, Value2), (Value1, Value2) 

Per riferimento alla presente uno sguardo al MOC Corso 2778A - Scrittura di query SQL in SQL Server 2008.

+259

E si noti che il numero massimo di righe in una istruzione di inserimento è 1000. 21 mar. 132013-03-21 13:39:29

+129

Che dovrebbe essere formulato "il numero massimo di righe in una clausola" VALUES' è 1000 ". Non è l'istruzione 'INSERT' che è limitata a 1000 righe. 19 dic. 132013-12-19 17:58:48

  0

@Anon Grazie per aver chiarito il commento molto fuorviante di ChrisJ. Mi ha salvato da un doloroso debugging. :) 11 mar. 142014-03-11 13:33:14

+17

So che questa domanda e risposta sono vecchie, ma mi piace ricordare che esiste una differenza funzionale tra l'utilizzo del metodo menzionato nella domanda e in questa risposta. La prima esecuzione attiva la quantità X di volte con 1 record nella tabella inserita. Il secondo esegue trigger 1 volta con x quantità di record nella tabella inserita. Rendere il secondo metodo la scelta migliore per le prestazioni presupponendo che i trigger siano stati eseguiti correttamente con gli inserimenti batch. 24 apr. 142014-04-24 12:07:40

+7

Questo non funziona con SQL Server 2005, vedere http://stackoverflow.com/questions/2624713/how-do-i-insert-multiple-rows-without-repeating-the-insert-into-dbo-blah- parte 28 apr. 142014-04-28 16:40:54

+1

non hai un punto e virgola alla fine dell'istruzione, mentre altre risposte sì. ne hai bisogno o no? 07 dic. 152015-12-07 18:51:25

+4

@ahnbizcad I punti e virgola in T-sql sono generalmente facoltativi, ma in futuro verranno segnalati come obbligatori. Dovresti prendere l'abitudine di usarli per terminare ogni affermazione - il tuo codice sembrerà anche più IMO. 09 dic. 152015-12-09 03:51:21

+1

@NReilingh Non ne ero assolutamente a conoscenza. In realtà ho proceduto a cercarlo. Per riferimento, ecco un collegamento alle [convenzioni di sintassi t-sql nella libreria microsoft] (https://msdn.microsoft.com/en-us/library/ms177563.aspx). Aggiungo anche un link a [un interessante articolo sull'argomento] (http://www.dbdelta.com/always-use-semicolon-statement-terminators/). Grazie ! 12 dic. 152015-12-12 17:54:24

  0

Questo è anche più lento di quello che sta facendo attualmente: http://stackoverflow.com/questions/8635818/multiple-insert-statements-vs-single-insert-with-multiple-values ​​ 08 ago. 162016-08-08 23:24:49

  0

@Anon Se hai bisogno di più di 1000 righe potresti unire più costruttori 'VALUES' a 1000 righe in un CTE per il tuo inserto. Conta ancora come una query! 09 mar. 172017-03-09 20:04:08

  0

sai in quale specifica sql è stata introdotta? (più VALORI) 27 lug. 172017-07-27 08:50:41

  0

Il numero massimo di righe è 1000, MA il numero ottimale è compreso tra 10 e 100 (in base al conteggio delle colonne). Leggi [questo articolo] (https://www.red-gate.com/simple-talk/sql/performance/comparing-multiple-rows-insert-vs-single-row-insert-with-three-data-load- metodi /) 20 nov. 172017-11-20 17:40:18


65

INSERT istruzioni che utilizzano VALUES sintassi possono inserire più righe. Per fare ciò, includere più elenchi di valori di colonna, ciascuno racchiuso tra parentesi e separati da virgole.

Esempio:

INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9); 
+2

Una domanda migliore è perché vorresti? Perché non eseguire i 4 comandi puliti tutti insieme in un unico lotto. Se una riga fallisce, il tuo batch fallisce. se li fai individualmente raggruppati, 3 di 4 riescono. 07 set. 162016-09-07 16:41:10

+3

@ m-t-head Ho un esempio del perché voglio e ti darò 2 motivi. Sto inserendo in una tabella che ha un trigger di verifica dell'integrità dei dati. Motivo 1: l'inserimento di valori separatamente violerebbe il controllo di integrità, ripristinando la transazione e restituendo un errore. Sto usando SQL Server che non supporta i vincoli posticipati, quindi anche se invece di un trigger fosse un vincolo regolare, non funzionerebbe ancora. Motivo 2: la verifica dell'integrità è una procedura costosa e preferirei eseguirla una volta anziché 1000 di volte per transazione. Sto ancora cercando soluzioni. 21 gen. 172017-01-21 06:36:38

  0

è possibile creare un CTE e utilizzare l'inserto in YourTable (ID, Nome) Da selezionare ID, Nome da CTE 25 lug. 172017-07-25 05:15:50