MySQL INSERT INTO таблица VALUES .. против INSERT INTO таблица SET

190

В чем основное отличие между 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

А как насчет производительности этих двух?

  • 10
    После прочтения Code Complete и постоянного акцента Макконнелла на удобочитаемости становится неприятным, что INSERT INTO table SET не является стандартным. Кажется, намного понятнее. Думаю, мне все равно придется использовать INSERT INTO table ([column name, column name b]) VALUES (['value a', 'value b']) чтобы уберечь себя от проблем, если я перенесусь на Postgres ,
  • 0
    Этот вопрос стал вирусным как видео Канье!
Теги:
performance

3 ответа

152
Лучший ответ

Насколько я могу судить, оба синтаксиса эквивалентны. Первый стандарт SQL, второй - расширение MySQL.

Таким образом, они должны быть точно эквивалентными характеристиками.

http://dev.mysql.com/doc/refman/5.6/en/insert.html говорит:

INSERT вставляет новые строки в существующую таблицу. INSERT... VALUES и INSERT... SET формы инструкции вставляют строки на основе явно заданных значений. Форма INSERT... SELECT вставляет строки, выбранные из другой таблицы или таблиц.

  • 4
    Как вставить несколько значений, используя INSERT INTO table SET ? Это вообще возможно?
  • 2
    Что вы имеете в виду? В примере OP написано SET a = 1, b = 2, c = 3, что в моем понимании является несколькими значениями.
Показать ещё 3 комментария
13

Я думаю, что расширение предназначено для аналогичного синтаксиса для вставок и обновлений. В Oracle аналогичный синтаксический трюк:

UPDATE table SET (col1, col2) = (SELECT val1, val2 FROM dual)
  • 1
    Я думаю, что расширение создает больше проблем, чем решает.
  • 4
    @Pacerier, например? Единственная проблема, которую я вижу, это переносимость (которая во многих контекстах на самом деле не имеет значения); я что-то пропустил?
Показать ещё 8 комментариев
0

Так как синтаксисы эквивалентны (в любом случае 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 будет работать, тогда как другой будет. Но в большинстве практических случаев вы все-таки зацикливаете набор записей, чтобы делать вставки, хотя могут быть некоторые случаи, когда возможно построить один большой запрос, чтобы вставить кучу строк в таблицу в одном запросе, а также запрос для каждая строка может улучшить производительность. На самом деле не знаю.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню