Ответы:
Насколько я могу судить, оба синтаксиса эквивалентны. Первый - стандарт SQL, второй - расширение MySQL.
Таким образом, они должны быть точно эквивалентны по производительности.
http://dev.mysql.com/doc/refman/5.6/en/insert.html говорит:
INSERT вставляет новые строки в существующую таблицу. Формы оператора INSERT ... VALUES и INSERT ... SET вставляют строки на основе явно указанных значений. Форма INSERT ... SELECT вставляет строки, выбранные из другой таблицы или таблиц.
INSERT INTO table SET? Это вообще возможно?
Я думаю, что расширение предназначено, чтобы позволить подобный синтаксис для вставок и обновлений. В Oracle похожая синтаксическая хитрость:
UPDATE table SET (col1, col2) = (SELECT val1, val2 FROM dual)
INSERT ... SET ...и INSERT ... VALUES .... Для функции у вас есть более короткий и быстрый код для записи, повышенная читаемость и устранение опечаток, вызванных путаницей порядка столбцов при написании VALUESпредложения. Моя интуиция говорит мне, что в сети хорошее перевешивает плохое, но ваше мнение может отличаться.
Поскольку синтаксис эквивалентен (во всяком случае, в 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синтаксис сработает, тогда как другой сработает. Но в большинстве практических случаев вы циклически просматриваете набор записей для вставки в любом случае, хотя могут быть случаи, когда, возможно, создается один большой запрос для вставки набора строк в таблицу в одном запросе по сравнению с запросом для каждая строка может иметь улучшение производительности. На самом деле не знаю.
INSERT INTO table SETэто не является стандартом. Кажется, намного понятнее. Думаю, мне всеINSERT INTO table ([column name, column name b]) VALUES (['value a', 'value b'])равно придется использовать синтаксис, чтобы уберечь себя от неприятностей, если я перейду на Postgres.