MySQL INSERT INTO VALUES de la tabla .. vs INSERT INTO table SET

252

¿Cuál es la principal diferencia entre INSERT INTO table VALUES ..y INSERT INTO table SET ?

Ejemplo:

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

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

¿Y qué hay del rendimiento de estos dos?

Irmantas
fuente
12
Después de leer Code Complete y el énfasis constante de McConnell en la legibilidad, parece lamentable que INSERT INTO table SETno sea estándar. Parece mucho más claro. Supongo que tendré que usar la INSERT INTO table ([column name, column name b]) VALUES (['value a', 'value b'])sintaxis de todos modos para salvarme de los problemas si me transfiero a Postgres.
Cluelesscoder

Respuestas:

195

Por lo que puedo decir, ambas sintaxis son equivalentes. El primero es el estándar SQL, el segundo es la extensión de MySQL.

Por lo tanto, deberían ser exactamente equivalentes en cuanto a rendimiento.

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

INSERT inserta nuevas filas en una tabla existente. Las formas INSERT ... VALUES e INSERT ... SET de la instrucción insertan filas basadas en valores especificados explícitamente. El formulario INSERTAR ... SELECCIONAR inserta filas seleccionadas de otra tabla o tablas.

Vinko Vrsalovic
fuente
44
¿Cómo INSERTAR usando múltiples valores INSERT INTO table SET? ¿Es esto posible?
pixelfreak
2
¿Qué quieres decir? El ejemplo que tiene el OP dice SET a = 1, b = 2, c = 3, que en mi opinión son múltiples valores.
Vinko Vrsalovic
10
Quise decir, INSERTAR varias filas. Como: INSERTAR EN la tabla (a, b, c) VALORES (1,2,3), (4,5,6), (7,8,9);
pixelfreak
55
Solo las instrucciones INSERT que usan la sintaxis VALUES pueden insertar varias filas.
Vinko Vrsalovic
8
@VinkoVrsalovic, no es cierto, insertar selección también puede insertar varias filas cuando se seleccionan varias filas
Pacerier
15

Creo que la extensión está destinada a permitir una sintaxis similar para inserciones y actualizaciones. En Oracle, un truco sintáctico similar es:

UPDATE table SET (col1, col2) = (SELECT val1, val2 FROM dual)
fthiella
fuente
55
@Pacerier como? El único problema que veo es de portabilidad (que, en muchos contextos, realmente no importa); ¿Me estoy perdiendo de algo?
Mark Amery
1
@ MarkAmery, sí, cuando lo miras, no hay un beneficio real. La desventaja es la pérdida innecesaria de tiempo , toda la existencia de este hilo demuestra mi punto.
Pacerier
8
@Pacerier ¿No estoy seguro de ver tu punto? ¿Qué tiempo perdido? Hay un beneficio, que ya se ha señalado: solo necesita recorrer una matriz de pares clave / valor una vez para crear su instrucción INSERT, en lugar de dos veces, ya que necesitaría usar la sintaxis VALUES, lo que conduce a una forma más corta y clara y código más rápido de escribir.
Mark Amery el
@ MarkAmery, pero este truco de oráculo no tiene ese beneficio. Primero nombra todas las columnas, luego todos los valores.
hobbs
12
@Pacerier Ese es un punto justo, y hay que compensarlo. Contra la característica, tiene problemas de portabilidad y tiempo perdido investigando la diferencia entre INSERT ... SET ...y INSERT ... VALUES .... Para la función, tiene un código más corto y más rápido de escribir, una mayor legibilidad y la eliminación de errores tipográficos causados ​​por mezclar el orden de las columnas al escribir su VALUEScláusula. Mi instinto me dice que en la red lo bueno supera a lo malo, pero su juicio puede ser diferente.
Mark Amery
4

Dado que las sintaxis son equivalentes (de todos modos en MySQL), prefiero la INSERT INTO table SET x=1, y=2sintaxis, ya que es más fácil de modificar y detectar errores en la declaración, especialmente cuando se insertan muchas columnas. Si tiene que insertar 10 o 15 o más columnas (x, y) VALUES (1,2), en mi opinión , es realmente fácil mezclar algo usando la sintaxis.

Si la portabilidad entre diferentes estándares SQL es un problema, entonces tal vez INSERT INTO table (x, y) VALUES (1,2)sería preferible.

Y si desea insertar varios registros en una sola consulta, no parece que la INSERT INTO ... SETsintaxis funcione, mientras que la otra sí. Pero en la mayoría de los casos prácticos, de todos modos está recorriendo un conjunto de registros para hacer inserciones, aunque podría haber algunos casos en los que tal vez construya una consulta grande para insertar un grupo de filas en una tabla en una consulta, en lugar de una consulta para cada fila, podría tener una mejora en el rendimiento. Realmente no lo se.

Aaron Wallentine
fuente