2009-05-14 5 views
195

В чем основное отличие между INSERT INTO table VALUES .. и INSERT INTO table SET?MySQL INSERT INTO таблицы VALUES .. vs INSERT INTO таблица SET

Пример:

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

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

А что о выполнении этих двух?

+9

После прочтения кода Complete и постоянного акцента McConnell на удобочитаемость, кажется неудачным, что 'INSERT INTO table SET' не является стандартным. Это кажется намного яснее. Я предполагаю, что мне придется использовать таблицу INSERT INTO ([имя столбца, имя столбца b]). VALUES (['a a', 'value b']) 'синтаксис в любом случае, чтобы спасти себя от проблем, если я переношу к Postgres. – cluelesscoder

+0

Этот вопрос стал вирусом, как видео Kanye! – aMazing

ответ

156

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

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

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

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

+3

Как вы вставляете несколько значений с помощью 'INSERT INTO table SET'? Возможно ли это? – pixelfreak

+2

Что это значит? Пример OP говорит, что SET a = 1, b = 2, c = 3, что является множественным значением в моем понимании. –

+6

Я имел в виду, INSERT несколько строк. Например: INSERT INTO table (a, b, c) ЗНАЧЕНИЯ (1,2,3), (4,5,6), (7,8,9); – pixelfreak

13

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

UPDATE table SET (col1, col2) = (SELECT val1, val2 FROM dual) 
+1

Я думаю, что расширение создает больше проблем, чем оно решает. – Pacerier

+4

@ Pacerier Как? Единственная проблема, которую я вижу, - это переносимость (которая во многих контекстах не имеет большого значения); я что-то упускаю? –

+1

@MarkAmery, да, когда вы смотрите на нее, нет никакой реальной выгоды. Недостатком является ** ненужное время, потраченное впустую **, все существование этой нити доказывает мою мысль. – Pacerier

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