MySQL INSERT INTO table VALUES .. vs INSERT INTO table SET


252

Qual è la differenza principale tra INSERT INTO table VALUES ..e INSERT INTO table SET?

Esempio:

INSERT INTO table (a, b, c) VALUES (1,2,3)

INSERT INTO table SET a=1, b=2, c=3

E le prestazioni di questi due?


12
Dopo aver letto Code Complete e la costante enfasi posta da McConnell sulla leggibilità, sembra sfortunato che INSERT INTO table SETnon sia standard. Sembra molto più chiaro. Immagino che dovrò INSERT INTO table ([column name, column name b]) VALUES (['value a', 'value b'])comunque usare la sintassi per salvarmi dai guai se porto su Postgres.
cluelesscoder,

Risposte:


195

Per quanto ne so, entrambe le sintassi sono equivalenti. Il primo è lo standard SQL, il secondo è l'estensione di MySQL.

Quindi dovrebbero essere esattamente equivalenti in termini di prestazioni.

http://dev.mysql.com/doc/refman/5.6/en/insert.html dice:

INSERT inserisce nuove righe in una tabella esistente. I moduli INSERT ... VALUES e INSERT ... SET dell'istruzione inseriscono le righe in base a valori esplicitamente specificati. Il modulo INSERT ... SELECT inserisce le righe selezionate da un'altra o più tabelle.


4
Come INSERIRE più valori usando INSERT INTO table SET? È possibile?
pixelfreak,

2
Cosa intendi? L'esempio dell'OP dice SET a = 1, b = 2, c = 3 che è valori multipli nella mia comprensione.
Vinko Vrsalovic,

10
Intendevo INSERIRE più righe. Come: INSERIRE nella tabella (a, b, c) VALORI (1,2,3), (4,5,6), (7,8,9);
pixelfreak,

5
Solo le istruzioni INSERT che utilizzano la sintassi VALUES possono inserire più righe.
Vinko Vrsalovic,

8
@VinkoVrsalovic, non vero, inserisci selezione può anche inserire più righe quando sono selezionate più righe
Pacerier

15

Penso che l'estensione abbia lo scopo di consentire una sintassi simile per inserimenti e aggiornamenti. In Oracle, un simile trucco sintattico è:

UPDATE table SET (col1, col2) = (SELECT val1, val2 FROM dual)

5
@Pacerier Come? L'unico problema che vedo è di portabilità (che, in molti contesti, non ha molta importanza); mi sto perdendo qualcosa?
Mark Amery,

1
@MarkAmery, sì, quando lo guardi, non c'è alcun vantaggio reale. Lo svantaggio è inutile spreco di tempo , l'intera esistenza di questo thread dimostra il mio punto.
Pacerier,

8
@Pacerier Non sono sicuro di vedere il tuo punto? Che tempo perso? C'è un vantaggio, che è già stato sottolineato: per creare la tua istruzione INSERT devi solo passare in rassegna una serie di coppie chiave / valore una volta, anziché due volte rispetto a quando avresti bisogno di usare la sintassi VALUES, che porta a un tempo più breve, più chiaro e codice più veloce da scrivere.
Mark Amery,

@MarkAmery ma questo trucco dell'oracolo non ha questo vantaggio. Prima dai un nome a tutte le colonne, poi a tutti i valori.
Hobbs

12
@Pacerier Questo è un punto giusto e c'è un compromesso da valutare. Contro la funzionalità si hanno problemi di portabilità e tempo perso nella ricerca della differenza tra INSERT ... SET ...e INSERT ... VALUES .... Per la funzionalità hai codice più breve e più veloce da scrivere, maggiore leggibilità ed eliminazione di errori di battitura causati dalla confusione dell'ordine delle colonne durante la scrittura della VALUESclausola. Il mio istinto mi dice che in rete il bene supera il male, ma il tuo giudizio può essere diverso.
Mark Amery,

4

Poiché le sintassi sono equivalenti (comunque in MySQL), preferisco la INSERT INTO table SET x=1, y=2sintassi, poiché è più facile da modificare e più facile rilevare errori nell'istruzione, specialmente quando si inseriscono molte colonne. Se devi inserire 10 o 15 o più colonne, è davvero facile confondere qualcosa usando la (x, y) VALUES (1,2)sintassi, secondo me.

Se la portabilità tra diversi standard SQL è un problema, forse INSERT INTO table (x, y) VALUES (1,2)sarebbe preferibile.

E se vuoi inserire più record in una singola query, non sembra che la INSERT INTO ... SETsintassi funzionerà, mentre l'altra lo farà. Ma nella maggior parte dei casi pratici, stai eseguendo il ciclo di un set di record per eseguire comunque inserimenti, anche se potrebbero esserci alcuni casi in cui forse costruendo una query di grandi dimensioni per inserire un gruppo di righe in una tabella in una query, rispetto a una query per ogni riga, potrebbe avere un miglioramento delle prestazioni. Davvero non lo so.

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.