MySQL INSERT INTO na tabela VALUES .. vs INSERT INTO na tabela SET

252

Qual é a principal diferença entre INSERT INTO table VALUES ..e 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 o desempenho desses dois?

Irmantas
fonte
12
Depois de ler o Code Complete e a constante ênfase de McConnell na legibilidade, parece lamentável que isso INSERT INTO table SETnão seja padrão. Parece muito mais claro. Acho que vou ter que usar a INSERT 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.
Cluelesscoder

Respostas:

195

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.

Vinko Vrsalovic
fonte
4
Como você insere vários valores usando INSERT INTO table SET? Isso é possível?
pixelfreak
2
O que você quer dizer? O exemplo do OP diz SET a = 1, b = 2, c = 3, que são vários valores em meu entendimento.
Vinko Vrsalovic 10/06/12
10
Eu quis dizer, INSERIR várias linhas. Como: INSERIR NA tabela (a, b, c) VALORES (1,2,3), (4,5,6), (7,8,9);
pixelfreak
5
Somente instruções INSERT que usam a sintaxe VALUES podem inserir várias linhas.
Vinko Vrsalovic
8
@VinkoVrsalovic, não é verdade, insira selecionar também pode inserir várias linhas quando várias linhas são selecionadas
Pacerier
15

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)
fthiella
fonte
5
@Pacerier Como? O único problema que vejo é portabilidade (o que, em muitos contextos, realmente não importa); estou esquecendo de algo?
Mark Amery
1
@ MarkAmery, sim, quando você olha para ele, não há benefício real. A desvantagem é desperdiçar tempo desnecessário , toda a existência desse segmento comprova meu ponto.
Pacerier 29/01
8
@ Pacerier Não tenho certeza se entendo seu ponto de vista? Que tempo perdido? Há um benefício que já foi apontado: você só precisa fazer um loop sobre uma matriz de pares de chave / valor uma vez para criar sua instrução INSERT, em vez de duas vezes o que seria necessário para usar a sintaxe VALUES, o que leva a uma definição mais curta e clara. e código de gravação mais rápida.
Mark Amery
@ MarkAmery, mas esse truque da Oracle não tem esse benefício. Você nomeia todas as colunas primeiro e depois todos os valores.
Hbbs
12
@Pacerier Esse é um argumento justo, e há uma troca a ser ponderada. Contra o recurso, você tem problemas de portabilidade e perde tempo pesquisando a diferença entre 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 VALUEScláusula. Meu intestino me diz que, na rede, o bem supera o mal, mas seu julgamento pode ser diferente.
Mark Amery
4

Como as sintaxes são equivalentes (no MySQL, de qualquer forma), prefiro a INSERT INTO table SET x=1, y=2sintaxe, 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 ... SETsintaxe 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.

Aaron Wallentine
fonte