INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO] tbl_name [(col_name,...)] VALUES ({expression | DEFAULT},...),(...),... [ ON DUPLICATE KEY UPDATE col_name=expression, ... ]
O
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO] tbl_name SET col_name={expression | DEFAULT}, ... [ ON DUPLICATE KEY UPDATE col_name=expression, ... ]
O
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO] tbl_name [(col_name,...)] SELECT ...
INSERT inserta nuevas filas en una tabla existente. Los formatos INSERT ... VALUES e INSERT ... SET, insertas filas basándose en los valores especificados explícitamente. El formato The INSERT ... SELECT inserta filas seleccionadas de otra tabla o tablas. El formato INSERT ... VALUES con una lista de múltiples valores está soportada por MySQL desde la versión 3.22.5. La sintaxis INSERT ... SET está soportada por MySQL desde la versión 3.22.10.
tbl_name es la tabla donde se insertarán las filas. Las columnas para las que la sentencia proporciona valores se pueden especificar de las siguientes formas:
Los valores de columnas se pueden proporcionar de varias formas:
mysql> INSERT INTO tbl_name () VALUES();
expr
para proporcionar un valor de columna. Esto
forzará complejas conversiones de tipo si el de la expresión no coincide con el tipo de la columna,
y la conversión de un valor dado puede provocar diferentes valores insertados dependiendo del tipo
de la columna. Por ejemplo, insertar la cadena '1999.0e-2' en una columna INT, FLOAT, DECIMAL(10,6)
o YEAR producirá los valores 1999, 19.9921, 19.992100 y 1999. El motivo es que el valor almacenado
en una columna INT y YEAR sea 1999 es que la conversión de cadena a entero mira sólo la parte inicial
de la cadena que se pueda considerar un valor entero o un año válido. Para columnas en punto
flotante o punto fijo, la conversión de cadena a punto flotante tiene en cuenta la cadena completa
como un valor válido en coma flotante. Una expresión expr
se puede referiri a cualquier
columna que se haya asignado previamente en la lista de valores. Por ejemplo, se puede hacer esto,
ya que el valor de col2 se refiere a col1, que ya ha sido asignado:mysql> INSERT INTO tbl_name (col1,col2) VALUES(15,col1*2);Pero no se puede hacer esto, porque el valor para col1 se refiere a col2, que se asigna después de col1:
mysql> INSERT INTO tbl_name (col1,col2) VALUES(col2*2,15);La excepción es para columnas que contengan valores autoincrementados. Esto es debido a que el valor AUTO_INCREMENT se genera después de la asignación de cualquier otro valor, así que cualquier referencia a una columna AUTO_INCREMENT devolverá un 0.
La sentencia INSERT soporta los modificadores siguientes:
Si se especifica la cláusula ON DUPLICATE KEY UPDATE (nueva en MySQL 4.1.0), y se inserta una fila que puede provocar un valor duplicado en una clave PRIMARY o UNIQUE, se realiza un UPDATE (actualización) de la fila antigua. Por ejemplo, si se declara una columna 'a' como UNIQUE y ya contiene el valor 1, las dos sentencias siguientes tienen el mismo efecto:
mysql> INSERT INTO table (a,b,c) VALUES (1,2,3) -> ON DUPLICATE KEY UPDATE c=c+1;
mysql> UPDATE table SET c=c+1 WHERE a=1;
El valor de filas afectadas es 1 si la fila es insertada como un nuevo registro y 2 si se actualiza un registro ya existente.
Nota: si la columna 'b' en única también, la sentencia INSERT puede ser equivalente a esta sentecia UPDATE:
mysql> UPDATE table SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;
Si a=1 OR b=2 se cumple para varias filas, sólo una será actualizada. En general, se debe intentar evitar el uso de de la cláusula ON DUPLICATE KEY en tablas con múltiples claves UNIQUE.
Desde MySQL 4.1.1 es posible usar la función VALUES(col_name) en una cláusula UPDATE para referirse a los valores de columna en la parte INSERT de una sentencia INSERT ... UPDATE. En otras palabras, VALUES(col_name) en una cláusula UPDATE se refiere al valor col_name que será insertado si no existe un conflicto de clave duplicada. Esta función es especialmente corriente en inserciones de varias filas. La función VALUES sólo tiene sentido en sentencias INSERT ... UPDATE y devuelve NULL en otro caso.
Ejemplo:
mysql> INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6) -> ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);
El comando anterior es idéntico a las dos sentencias siguientes:
mysql> INSERT INTO table (a,b,c) VALUES (1,2,3) -> ON DUPLICATE KEY UPDATE c=3; mysql> INSERT INTO table (a,b,c) VALUES (4,5,6) -> ON DUPLICATE KEY UPDATE c=9;
Cuando se usa ON DUPLICATE KEY UPDATE, la opción DELAYED se ignora.
Se puede encontrar el valor usado para una columna AUTO_INCREMENT usando la función LAST_INSERT_ID(). Desde el API C, usar la función mysql_insert_id. Sin embargo, notar que las dos funciones no se comportan de forma idéntica en todas las circunstancias.
Si se usa una sentencia INSERT ... VALUES con una lista de múltiples valores o INSERT ... SELECT, la sentencia devuelve una cadena de información con este formato:
Records: 100 Duplicates: 0 Warnings: 0
Records indica el número de filas procesadas por la sentencia. (No es necesariamente el número de filas insertadas. "Duplicates" puede ser distinto de cero.) "Duplicates" indica el número de filas que no pudieron ser insertadas porque contienen algún valor para un índice único ya existente. "Warnings" indica el número de intentos de inserción de valores de columnas que han causado algún tipo de problemas. Se pueden producir "Warnings" bajo cualquiera de las siguientes condiciones:
Si se usa el API C, la cadena de información se puede obtener mediante la función mysql_info.
Ver también: INSERT ... SELECT e INSERT DELAYED
(4.1.1)
© Febrero de 2005 Salvador Pozo, salvador@conclase.net