MySQL INSERT INTO Tabelle VALUES .. vs INSERT INTO Tabelle SET

252

Was ist der Hauptunterschied zwischen INSERT INTO table VALUES ..und INSERT INTO table SET?

Beispiel:

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

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

Und was ist mit der Leistung dieser beiden?

Irmantas
quelle
12
Nach dem Lesen von Code Complete und McConnells ständiger Betonung der Lesbarkeit scheint es bedauerlich, dass dies INSERT INTO table SETnicht Standard ist. Es scheint viel klarer. Ich denke, ich muss die INSERT INTO table ([column name, column name b]) VALUES (['value a', 'value b'])Syntax trotzdem verwenden, um mich vor Problemen zu schützen, wenn ich auf Postgres portiere.
Ahnungsloser

Antworten:

195

Soweit ich das beurteilen kann, sind beide Syntaxen gleichwertig. Der erste ist der SQL-Standard, der zweite ist die Erweiterung von MySQL.

Sie sollten also in Bezug auf die Leistung genau gleichwertig sein.

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

INSERT fügt neue Zeilen in eine vorhandene Tabelle ein. Die Formulare INSERT ... VALUES und INSERT ... SET der Anweisung fügen Zeilen basierend auf explizit angegebenen Werten ein. Das Formular INSERT ... SELECT fügt Zeilen ein, die aus einer anderen Tabelle oder Tabellen ausgewählt wurden.

Vinko Vrsalovic
quelle
4
Wie fügen Sie mehrere Werte mit ein INSERT INTO table SET? Ist das überhaupt möglich?
Pixelfreak
2
Was meinst du? Das Beispiel, das das OP hat, sagt SET a = 1, b = 2, c = 3, was nach meinem Verständnis mehrere Werte sind.
Vinko Vrsalovic
9
Ich meinte, mehrere Zeilen einfügen. Wie: INSERT INTO Tabelle (a, b, c) WERTE (1,2,3), (4,5,6), (7,8,9);
Pixelfreak
5
Nur INSERT-Anweisungen, die die VALUES-Syntax verwenden, können mehrere Zeilen einfügen.
Vinko Vrsalovic
8
@VinkoVrsalovic, nicht wahr, Einfügen auswählen kann auch mehrere Zeilen einfügen, wenn mehrere Zeilen ausgewählt sind
Pacerier
15

Ich denke, die Erweiterung soll eine ähnliche Syntax für Einfügungen und Aktualisierungen ermöglichen. In Oracle ist ein ähnlicher syntaktischer Trick:

UPDATE table SET (col1, col2) = (SELECT val1, val2 FROM dual)
fthiella
quelle
5
@ Pacerier Wie? Das einzige Problem, das ich sehe, ist eine Portabilität (die in vielen Zusammenhängen nicht wirklich wichtig ist). vermisse ich etwas
Mark Amery
1
@ MarkAmery, ja, wenn Sie es sich ansehen, gibt es keinen wirklichen Vorteil. Der Nachteil ist unnötige Zeitverschwendung , die ganze Existenz dieses Threads beweist meinen Standpunkt.
Pacerier
8
@ Pacerier Ich bin nicht sicher, ob ich deinen Standpunkt verstehe? Welche Zeit verschwendet? Es gibt einen Vorteil, auf den bereits hingewiesen wurde: Sie müssen ein Array von Schlüssel / Wert-Paaren nur einmal durchlaufen, um Ihre INSERT-Anweisung zu erstellen, anstatt zweimal, wenn Sie die VALUES-Syntax verwenden müssten, was zu einer kürzeren und klareren Syntax führt und schneller zu schreibender Code.
Mark Amery
@MarkAmery aber das Orakel Trick nicht haben , dass Nutzen. Sie benennen zuerst alle Spalten und dann alle Werte.
Hobbs
12
@ Pacerier Das ist ein fairer Punkt, und es gibt einen Kompromiss, der abgewogen werden muss. Gegen die Funktion haben Sie Portabilitätsprobleme und Zeitverschwendung bei der Untersuchung des Unterschieds zwischen INSERT ... SET ...und INSERT ... VALUES .... Für die Funktion haben Sie kürzeren, schneller zu schreibenden Code, eine verbesserte Lesbarkeit und die Beseitigung von Tippfehlern, die durch Verwechslung Ihrer Spaltenreihenfolge beim Schreiben Ihrer VALUESKlausel verursacht werden. Mein Bauch sagt mir, dass im Netz das Gute das Schlechte überwiegt, aber Ihr Urteil kann abweichen.
Mark Amery
4

Da die Syntaxen äquivalent sind (in MySQL jedenfalls), bevorzuge ich die INSERT INTO table SET x=1, y=2Syntax, da es einfacher ist, Fehler in der Anweisung zu ändern und leichter abzufangen, insbesondere beim Einfügen vieler Spalten. Wenn Sie 10 oder 15 oder mehr Spalten einfügen müssen, ist es wirklich einfach, etwas mit dem zu verwechseln(x, y) VALUES (1,2) meiner Meinung Syntax .

Wenn die Portabilität zwischen verschiedenen SQL-Standards ein Problem darstellt, ist dies möglicherweise der Fall INSERT INTO table (x, y) VALUES (1,2) bevorzugt.

Und wenn Sie mehrere Datensätze in eine einzelne Abfrage einfügen möchten, scheint die INSERT INTO ... SETSyntax nicht zu funktionieren, während die andere funktioniert. In den meisten praktischen Fällen durchlaufen Sie jedoch eine Reihe von Datensätzen, um Einfügungen durchzuführen. In einigen Fällen kann es jedoch vorkommen, dass Sie eine große Abfrage erstellen, um eine Reihe von Zeilen in eine Tabelle in einer Abfrage einzufügen, im Gegensatz zu einer Abfrage für Jede Zeile kann eine Leistungsverbesserung aufweisen. Weiß wirklich nicht.

Aaron Wallentine
quelle