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

252

Jaka jest główna różnica między INSERT INTO table VALUES .. i INSERT INTO table SET?

Przykład:

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

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

A co z wydajnością tych dwóch?

Irmantas
źródło
12
Po przeczytaniu Code Complete i ciągłym nacisku McConnella na czytelność niefortunne wydaje się INSERT INTO table SETto nietypowe. Wydaje się to o wiele wyraźniejsze. Myślę, że i tak będę musiał użyć tej INSERT INTO table ([column name, column name b]) VALUES (['value a', 'value b'])składni, aby uchronić się przed problemami, jeśli prześlę port do Postgres.
cluelesscoder

Odpowiedzi:

195

O ile wiem, obie składnie są równoważne. Pierwszy to standard SQL, drugi to rozszerzenie MySQL.

Dlatego powinny być dokładnie równoważne pod względem wydajności.

http://dev.mysql.com/doc/refman/5.6/en/insert.html mówi:

INSERT wstawia nowe wiersze do istniejącej tabeli. Formularze INSERT ... VALUES i INSERT ... SET instrukcji wstawiają wiersze na podstawie wyraźnie określonych wartości. Formularz WSTAW ... WYBIERZ wstawia wiersze wybrane z innej tabeli lub tabel.

Vinko Vrsalovic
źródło
4
Jak WSTAWIĆ wiele wartości INSERT INTO table SET? Czy to w ogóle możliwe?
pixelfreak
2
Co masz na myśli? W przykładzie OP podano SET a = 1, b = 2, c = 3, co w moim rozumieniu jest wielokrotnością.
Vinko Vrsalovic
9
Miałem na myśli: WSTAW wiele wierszy. Jak: INSERT INTO tabela (a, b, c) WARTOŚCI (1,2,3), (4,5,6), (7,8,9);
pixelfreak
5
Tylko instrukcje INSERT, które używają składni VALUES, mogą wstawiać wiele wierszy.
Vinko Vrsalovic
8
@ VinkoVrsalovic, nieprawda, wstawianie może również wstawiać wiele wierszy, gdy wybranych jest wiele wierszy
Pacerier,
15

Myślę, że rozszerzenie ma umożliwić podobną składnię dla wstawek i aktualizacji. W Oracle podobna sztuczka składniowa to:

UPDATE table SET (col1, col2) = (SELECT val1, val2 FROM dual)
fthiella
źródło
5
@Pacerier Takie jak? Jedyny problem, jaki widzę, to przenośność (co w wielu kontekstach tak naprawdę nie ma znaczenia); czy coś mi brakuje?
Mark Amery
1
@ MarkAmery, tak, kiedy na to patrzysz, nie ma realnych korzyści. Wadą jest niepotrzebne marnowanie czasu , całe istnienie tego wątku potwierdza mój punkt widzenia.
Pacerier
8
@Pacerier Nie jestem pewien, czy rozumiem twój punkt widzenia? Która godzina zmarnowana? Istnieje pewna zaleta, na którą już zwrócono uwagę: wystarczy raz zapętlić tablicę par klucz / wartość, aby utworzyć instrukcję INSERT, zamiast dwa razy, niż trzeba użyć składni VALUES, co prowadzi do skrócenia, wyraźniejszego i szybszy do pisania kod.
Mark Amery
@ MarkAmery, ale ta sztuczka wyroczni nie ma tej korzyści. Nazwij najpierw wszystkie kolumny, a następnie wszystkie wartości.
hobbs
12
@Pacerier To słuszna kwestia i należy rozważyć kompromis. Wobec tej funkcji masz problemy z przenośnością i tracisz czas na badanie różnicy między INSERT ... SET ...i INSERT ... VALUES .... W przypadku funkcji masz krótszy, szybszy do pisania kod, zwiększoną czytelność i eliminację literówek spowodowanych pomieszaniem kolejności kolumn podczas pisania VALUESklauzuli. Mój żołądek mówi mi, że w sieci dobro przeważa nad złem, ale twój osąd może się różnić.
Mark Amery
4

Ponieważ składnie są równoważne (w każdym razie w MySQL), wolę tę INSERT INTO table SET x=1, y=2składnię, ponieważ łatwiej jest ją modyfikować i łatwiej wychwycić błędy w instrukcji, szczególnie przy wstawianiu wielu kolumn. Jeśli musisz wstawić 10 lub 15 lub więcej kolumn, (x, y) VALUES (1,2)moim zdaniem naprawdę łatwo jest coś pomieszać przy użyciu składni.

Jeśli problemem jest przenośność między różnymi standardami SQL, być może INSERT INTO table (x, y) VALUES (1,2)byłby preferowany.

A jeśli chcesz wstawić wiele rekordów w jednym zapytaniu, nie wydaje się, żeby INSERT INTO ... SETskładnia działała, podczas gdy drugi będzie. Ale w większości praktycznych przypadków przeglądasz zestaw rekordów, aby mimo to wstawiać, chociaż mogą istnieć przypadki, w których może być budowanie jednego dużego zapytania w celu wstawienia wiązki wierszy do tabeli w jednym zapytaniu w porównaniu do zapytania dla każdy wiersz może mieć poprawę wydajności. Naprawdę nie wiem.

Aaron Wallentine
źródło