Respostas:
Tanto quanto eu posso dizer, ambas as sintaxes são equivalentes. O primeiro é o padrão SQL, o segundo é a extensão do MySQL.
Portanto, 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.
INSERT INTO table SET
? Isso é possível?
Penso que a extensão se destina a permitir uma sintaxe semelhante para inserções e atualizações. No Oracle, um truque sintático semelhante é:
UPDATE table SET (col1, col2) = (SELECT val1, val2 FROM dual)
INSERT ... SET ...
e INSERT ... VALUES ...
. Para o recurso, você tem um código mais curto e de gravação mais rápida, maior legibilidade e eliminação de erros de digitação causados pela mistura da ordem das colunas ao escrever sua VALUES
cláusula. Meu intestino me diz que, na rede, o bem supera o mal, mas seu julgamento pode ser diferente.
Como as sintaxes são equivalentes (no MySQL, de qualquer forma), prefiro a INSERT INTO table SET x=1, y=2
sintaxe, pois é mais fácil modificar e mais fácil capturar erros na instrução, especialmente ao inserir muitas colunas. Se você precisar inserir 10 ou 15 ou mais colunas, é realmente fácil misturar algo usando a (x, y) VALUES (1,2)
sintaxe, na minha opinião.
Se a portabilidade entre diferentes padrões SQL for um problema, talvez INSERT INTO table (x, y) VALUES (1,2)
seja preferível.
E se você deseja inserir vários registros em uma única consulta, não parece que a INSERT INTO ... SET
sintaxe funcione, enquanto o outro funcionará. Mas, na maioria dos casos práticos, você faz um loop de um conjunto de registros para fazer inserções de qualquer maneira, embora possa haver alguns casos em que talvez seja possível construir uma consulta grande para inserir um monte de linhas em uma tabela em uma consulta, em comparação com uma consulta para cada linha, pode ter uma melhoria de desempenho. Realmente não sei.
INSERT INTO table SET
não seja padrão. Parece muito mais claro. Acho que vou ter que usar aINSERT INTO table ([column name, column name b]) VALUES (['value a', 'value b'])
sintaxe de qualquer maneira para me poupar de problemas se eu migrar para o Postgres.