Tabela MySQL INSERT INTO VALUES .. Tabela INSERT INTO SET

Qual é a principal diferença entre a INSERT INTO table VALUES .. e a INSERT INTO table SET ?

Exemplo:

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

E quanto ao desempenho desses dois?

Tanto quanto eu posso dizer, ambas as syntaxs são equivalentes. O primeiro é o padrão SQL, o segundo é a extensão do MySQL.

Então eles devem ser exatamente equivalentes ao desempenho.

http://dev.mysql.com/doc/refman/5.6/en/insert.html diz:

INSERT insere novas linhas em uma tabela existente. Os formulários INSERT … VALUES e INSERT … SET da instrução inserem linhas com base em valores especificados explicitamente. O formulário INSERT … SELECT insere linhas selecionadas de outra tabela ou tabelas.

Eu acho que a extensão é destinada a permitir uma syntax semelhante para inserções e atualizações. No Oracle, um truque sintático similar é:

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

Como as syntaxs são equivalentes (no MySQL, de qualquer forma), eu prefiro a syntax INSERT INTO table SET x=1, y=2 , já que é mais fácil modificar e capturar erros na instrução, especialmente ao inserir muitas colunas. Se você tiver que inserir 10 ou 15 ou mais colunas, é realmente fácil misturar algo usando a syntax (x, y) VALUES (1,2) , na minha opinião.

Se a portabilidade entre diferentes padrões SQL for um problema, então talvez a INSERT INTO table (x, y) VALUES (1,2) seja preferida.

E se você quiser inserir vários registros em uma única consulta, não parece que a syntax INSERT INTO ... SET irá funcionar, enquanto a outra irá funcionar. Mas na maioria dos casos práticos, você está fazendo um loop através de um conjunto de registros para fazer inserções de qualquer forma, embora possa haver alguns casos em que talvez construir uma consulta grande para inserir um monte de linhas em uma tabela em uma consulta vs. cada linha, pode ter uma melhoria de desempenho. Realmente não sei.