В чем основное отличие между INSERT INTO table VALUES ..
и INSERT INTO table SET
?
Пример:
INSERT INTO table (a, b, c) VALUES (1,2,3)
INSERT INTO table SET a=1, b=2, c=3
А как насчет производительности этих двух?
В чем основное отличие между INSERT INTO table VALUES ..
и INSERT INTO table SET
?
Пример:
INSERT INTO table (a, b, c) VALUES (1,2,3)
INSERT INTO table SET a=1, b=2, c=3
А как насчет производительности этих двух?
Насколько я могу судить, оба синтаксиса эквивалентны. Первый стандарт SQL, второй - расширение MySQL.
Таким образом, они должны быть точно эквивалентными характеристиками.
http://dev.mysql.com/doc/refman/5.6/en/insert.html говорит:
INSERT вставляет новые строки в существующую таблицу. INSERT... VALUES и INSERT... SET формы инструкции вставляют строки на основе явно заданных значений. Форма INSERT... SELECT вставляет строки, выбранные из другой таблицы или таблиц.
Я думаю, что расширение предназначено для аналогичного синтаксиса для вставок и обновлений. В Oracle аналогичный синтаксический трюк:
UPDATE table SET (col1, col2) = (SELECT val1, val2 FROM dual)
Так как синтаксисы эквивалентны (в любом случае MySQL), я предпочитаю синтаксис INSERT INTO table SET x=1, y=2
, поскольку его легче модифицировать и легче ловить ошибки в инструкции, особенно при вставке большого количества столбцов. Если вам нужно вставить 10 или 15 или более столбцов, очень легко смешать что-то с помощью синтаксиса (x, y) VALUES (1,2)
, на мой взгляд.
Если переносимость между различными стандартами SQL является проблемой, возможно, предпочтительнее INSERT INTO table (x, y) VALUES (1,2)
.
И если вы хотите вставить несколько записей в один запрос, не похоже, что синтаксис INSERT INTO ... SET
будет работать, тогда как другой будет. Но в большинстве практических случаев вы все-таки зацикливаете набор записей, чтобы делать вставки, хотя могут быть некоторые случаи, когда возможно построить один большой запрос, чтобы вставить кучу строк в таблицу в одном запросе, а также запрос для каждая строка может улучшить производительность. На самом деле не знаю.