Odpowiedzi:
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.
INSERT INTO table SET
? Czy to w ogóle możliwe?
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)
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 VALUES
klauzuli. 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ć.
Ponieważ składnie są równoważne (w każdym razie w MySQL), wolę tę INSERT INTO table SET x=1, y=2
skł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 ... SET
skł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.
INSERT INTO table SET
to nietypowe. Wydaje się to o wiele wyraźniejsze. Myślę, że i tak będę musiał użyć tejINSERT 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.