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

252

В чем главное отличие 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

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

Irmantas
источник
12
После прочтения Code Complete и постоянного акцента Макконнелла на удобочитаемости, к сожалению, INSERT INTO table SETэто не является стандартом. Кажется, намного понятнее. Думаю, мне все INSERT INTO table ([column name, column name b]) VALUES (['value a', 'value b'])равно придется использовать синтаксис, чтобы уберечь себя от неприятностей, если я перейду на Postgres.
cluelesscoder

Ответы:

195

Насколько я могу судить, оба синтаксиса эквивалентны. Первый - стандарт 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? Это вообще возможно?
pixelfreak
2
Что вы имеете в виду? В примере, указанном OP, написано SET a = 1, b = 2, c = 3, что в моем понимании является несколькими значениями.
Винко Врсалович
10
Я имел в виду, вставить несколько строк. Например: INSERT INTO table (a, b, c) VALUES (1,2,3), (4,5,6), (7,8,9);
pixelfreak
5
Только операторы INSERT, которые используют синтаксис VALUES, могут вставлять несколько строк.
Винко Врсалович
8
@VinkoVrsalovic, не правда, выбор вставки также может вставлять несколько строк, когда выбрано несколько строк
Pacerier
15

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

UPDATE table SET (col1, col2) = (SELECT val1, val2 FROM dual)
fthiella
источник
5
@Pacerier, например? Единственная проблема, которую я вижу, это переносимость (которая во многих контекстах не имеет большого значения); я что-то упускаю?
Марк Амери
1
@MarkAmery, да, когда вы смотрите на это, нет никакой реальной выгоды. Недостатком является ненужная трата времени , само существование этой темы подтверждает мою точку зрения.
Pacerier
8
@Pacerier Я не уверен, что понимаю твою точку зрения? Какое время впустую? Есть преимущество, о котором уже говорилось: вам нужно только зацикливаться на массиве пар ключ / значение один раз, чтобы создать оператор INSERT, а не дважды, как при использовании синтаксиса VALUES, что приводит к более короткому и ясному и более быстрый для написания кода.
Марк Амери
@MarkAmery, но этот оракул не имеет такой выгоды. Сначала вы называете все столбцы, а затем все значения.
Хоббс
12
@Pacerier Это справедливо, и есть вес, который нужно взвесить. В отношении этой функции у вас есть проблемы с переносимостью и время, потраченное на исследование различий между INSERT ... SET ...и INSERT ... VALUES .... Для функции у вас есть более короткий и быстрый код для записи, повышенная читаемость и устранение опечаток, вызванных путаницей порядка столбцов при написании VALUESпредложения. Моя интуиция говорит мне, что в сети хорошее перевешивает плохое, но ваше мнение может отличаться.
Марк Эмери
4

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

Аарон Уоллентин
источник