INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO]tbl_name[(col_name,...)] VALUES ({expr| DEFAULT},...),(...),... [ ON DUPLICATE KEY UPDATEcol_name=expr, ... ]
O:
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO]tbl_nameSETcol_name={expr| DEFAULT}, ... [ ON DUPLICATE KEY UPDATEcol_name=expr, ... ]
O:
INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE] [INTO]tbl_name[(col_name,...)] SELECT ... [ ON DUPLICATE KEY UPDATEcol_name=expr, ... ]
INSERT inserta nuevos registros en una tabla
existente. Las formas INSERT ... VALUES y
INSERT ... SET del comando insertan registros
basados en valores explícitamente especificados. La forma
INSERT ... SELECT inserta registros
seleccionados de otra tabla o tablas. INSERT ...
SELECT se discute en Sección 13.2.4.1, “Sintaxis de INSERT ... SELECT”.
tbl_name es la tabla en que los
registros deben insertarse. Las columnas para las que el comando
proporciona valores pueden especificarse como sigue:
La lista de nombres de columna o la cláusula
SET indican las columnas explícitamente.
Si no especifica la lista de columnas para INSERT
... VALUES o INSERT ... SELECT,
los valores para cada columna en la tabla deben
proporcionarse en la lista VALUES o por
el SELECT. Si no sabe el orden de las
columnas en la tabla, use DESCRIBE
para
encontrarlo.
tbl_name
Los valores de columna pueden darse de distintos modos:
Si no está ejecutando el modo estricto, cualquier columna
que no tenga un valor asignado explícitamente recibe su
valor por defecto (explícito o implícito). Por ejemplo, si
especifica una lista de columnas que no nombra todas las
columnas en la tabla, las no nombradas reciben sus valores
por defecto. Los valores por defecto asignados se describen
en Sección 13.1.5, “Sintaxis de CREATE TABLE”. Consulte
Sección 1.7.6.2, “Restricciones (constraints) sobre datos inválidos”.
Si quiere que un comando INSERT genere un
error a no ser que especifique explícitamente valores para
todas las columnas que no tienen un valor por defecto, debe
usar modo STRICT . Consulte
Sección 5.3.2, “El modo SQL del servidor”.
Use DEFAULT para asignar a una columna
explícitamente su valor por defecto. Esto hace más fácil
escribir comandos INSERT que asignan
valores a todas las columnas excepto unas pocoas, ya que le
permite evitar la escritura de una lista de valores
VALUES incompleta. De otro modo, tendría
que escribir la lista de los nombres de columna
correspondientes a cada valor en la lista
VALUES .
En MySQL 5.0, puede usar
DEFAULT(
como forma más general que puede usarse en expresiones para
producir un valor por defecto de una columna.
col_name)
Si la lista de columnas y la lista VALUES
están vacías, INSERT crea un registro
con cada conjunto de columnas con sus valores por defecto:
mysql> INSERT INTO tbl_name () VALUES();
En modo STRICT obtendrá un error si una
columna no tiene un valor por defecto. De otro modo, MySQL
usará el valor implícito para cualquier columna sin un
valor explícito por defecto definido.
Puede especificar una expresión
expr para proporcionar un valor
de columna. Esto puede involucar convesión de tipos si el
tipo de la expresión no coincide con el tipo de la columna,
y la conversión de un valor dado puede resultar en
distintos valores insertados dependiendo del tipo de
columna. Por ejmplo, insertar la cadena
'1999.0e-2' en una columna
INT, FLOAT,
DECIMAL(10,6), o YEAR
resulta en los valores 1999,
19.9921, 19.992100, y
1999 insertados, respectivamente. La
razón de que el valor almacenado en las columnas
INT y YEAR sea
1999 es que la conversión
cadena-a-entero consulta sólo el trozo de la parte inicial
de la cadena que se puede considerar como un entero válido
o año. Para las columnas de coma flotante o punto fijo, la
conversión cadena-a-coma-flotante considera la cadena
entera un valor válido.
Una expresión expr puede
referirse a cualquier columna que se haya asignado antes en
una lista de valores. Por ejemplo, puede hacer esto porque
el valor para col2 se refiere a
col1, que se ha asignado préviamente:
mysql> INSERT INTOtbl_name(col1,col2) VALUES(15,col1*2);
Pero lo siguiente no es legal, ya que el valor para
col1 se refiere a
col2, que se asigna tras
col1:
mysql> INSERT INTOtbl_name(col1,col2) VALUES(col2*2,15);
Una excepción involucra a columnas que contienen valores
AUTO_INCREMENT . Como el valor
AUTO_INCREMENT se genera tras otras
asignaciones de valores, cualquier referencia a una columna
AUTO_INCREMENT en la asignación retorna
un 0.
El comando INSERT soporta los siguientes
modificadores:
Si usa la palabra DELAYED, el servidor
pone el registro o registros a ser insertados en un búffer,
y el cliente realizando el comando INSERT
DELAYED puede continuar. Si la tabla está en uso,
el servidor trata los registros. Cuando la tabla se libera,
el servidor comienza a insertar registros, chequeando
periódicamente para ver si hay alguna petición de lectura
para la tabla. Si la hay, la cola de registros retardados se
suspende hasta que la tabla se libera de nuevo. Consulte
Sección 13.2.4.2, “Sintaxis de INSERT DELAYED”.
Si usa la palabra LOW_PRIORITY , la
ejecución de INSERT se retrasa hasta que
no hay otros clientes leyendo de la tabla. Esto incluye a
otros clientes que comiencen a leer mientras que los
clientes existentes están leyendo, y meintras el comando
INSERT LOW_PRIORITY está en espera. Es
posible, por lo tanto, para un cliente que realice un
comando INSERT LOW_PRIORITY esperar
durante mucho tiempo (o incluso para siempre) en un entorno
de muchas lecturas. (Esto es un contraste de INSERT
DELAYED, que deja al cliente continuar. Consulte
Sección 13.2.4.2, “Sintaxis de INSERT DELAYED”.) Tenga en cuenta que
LOW_PRIORITY no debe usarse normalmente
con tablas MyISAM y que hacerlo
deshabilita inserciones concurrentes. Consulte
Sección 14.1, “El motor de almacenamiento MyISAM”.
Si especifica HIGH_PRIORITY, deshabilita
el efecto de la opción
--low-priority-updates si el servidor se
arrancó con esa opción. Hace que las insecionces
concurrentes no se usen.
Los valores afectados por un INSERT
pueden usarse usando la función
mysql_affected_rows() de la API de C.
Consulte Sección 24.2.3.1, “mysql_affected_rows()”.
Si usa la palabra IGNORE en un comando
INSERT , los errores que ocurren mientras
se ejecuta el comando se tratan como advertencias. Por
ejemplo, sin IGNORE, un registro que
duplique un índice UNIQUE existente o
valor PRIMARY KEY en la tabla hace que un
error de clave duplicada en el comando se aborte. Con
IGNORE, el registro todavía no se
inserta, pero no se muestra error. Las conversionse de datos
dispararían errores y abortarían el comando si no se
sepecificara IGNORE . Con
IGNORE, los valores inválidaos se
ajustan al valor más cercano y se insertan; las
advertencias se producen pero el comando no se aborta. Puede
determinar con la función mysql_info()
de la API de C cuántos registros se insertan realmente en
la tabla.
Si especifica ON DUPLICATE KEY UPDATE, y se
inserta un registro que duplicaría un valor en un índice
UNIQUE o PRIMARY KEY, se
realiza un UPDATE del antiguo registro. Por
ejemplo, si la columna a se declara como
UNIQUE y contiene el valor
1, los siguientes dos comandos tienen efectos
idénticos:
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 registros afectados es 1 si el registros se inserta como un nuevo registro y 2 si un valor existente se actualiza.
Nota: Si la columna
b es única, el INSERT
sería equivalente a este comando 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 varios
registros, sólo un registro se actualiza.
En general, debería intentar evitar usar una cláusula
ON DUPLICATE KEY en tablas con claves únicas
múltiples.
MySQL 5.0 permite el uso de la función
VALUES(col_name) en la cláusula
UPDATE que se refiere a los valores de
columna de la porción INSERT del comando
INSERT ... UPDATE . En otras palabras,
VALUES(col_name) en la cláusula
UPDATE se refiere al valor de
col_name que se insertarían, no
ocurre conflicto de clave duplicada. Esta función es
especialmente útil en inserciones de múltiples registros. La
función VALUES() tiene sentido sólo en
comandos INSERT ... UPDATE y retorna
NULL de otro modo.
Ejemplo:
mysql> INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6) -> ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);
Este comando es idéntico a los siguientes dos comandos:
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 usa ON DUPLICATE KEY UPDATE, la
opción DELAYED se ignora.
Puede encontrar el valor usado para una columna
AUTO_INCREMENT usando la función SQL
LAST_INSERT_ID() . Desde la API C, use la
función mysql_insert_id() . Sin embargo,
debe tener en cuenta que las dos funciones no siempre se
comportan idénticamente. El comportamiento de comandos
INSERT respecto a columnas
AUTO_INCREMENT se discute en
Sección 12.9.3, “Funciones de información” y
Sección 24.2.3.34, “mysql_insert_id()”.
Si usa un comando INSERT ... VALUES con
listas de múltiples valores o INSERT ...
SELECT, el comando retorna una cadena de información
en este formato:
Records: 100 Duplicates: 0 Warnings: 0
Records indica el número de registros
procesados por el comando. (Este no es necesariamente el número
de registros realmente insertados, ya que
Duplicates puede ser distinto a cero.)
Duplicates indica el número de registros que
no pueden insertarse ya que duplicarían algunos valores de
índice únicos existentes Warnings indicata
el número de intentos para insertar valores de columna que
fueron problemáticos por algo. Las advertencias pueden ocurrir
bajo cualquiera de las siguientes condiciones:
Insertar NULL en una columna que se ha
declarado NOT NULL. Para comandos
INSERT de múltiples columnas o comandos
INSERT INTO... SELECT, la columna se
asigna con el valor por defecto para el tipo de datos de la
columna. Este es 0 para tipos numéricos,
la cadena vacía ('') para tipos de
cadenas, y el valor “cero” para tipos de fecha
y hora. Los comandos INSERT INTO ...
SELECT se tratan del mismo modo que inserciones de
múltiples registros porque el servidor no examina el
resultado del SELECT para ver si retorna
o no un único registro. (para un único registro
INSERT, no hay ninguna advertencia cuando
NULL se inserta en una columna
NOT NULL . En lugar de eso, el comando
falla con un error.)
Poner en una columna numérica un valor fuera del rango de la columna. El valor se redondea al punto final del rango más cercano.
Asigne un valor tal como '10.34 a' a una
columna numérica. El texto final se elimina y la parte
numérica se inserta. Si el valor de cadena no tiene parte
inicial numérica, la columna se pone a
0.
Insertar una cadena en una columna de cadena
(CHAR, VARCHAR,
TEXT, o BLOB) que
excede la maxima longitud de la columna. El valor se trunca
a la máxima longitud de la columna.
Insertar un valor en una columna de fecha u hora que es ilegal para el tipo de la columna. La columna se asigna con el valor cero apropiado para el tipo.
Si usa la API de C, la cadena de información puede obtenerse
invocando la función mysql_info() Consulte
Sección 24.2.3.32, “mysql_info()”.
Ésta es una traducción del manual de referencia de MySQL, que puede encontrarse en dev.mysql.com. El manual de referencia original de MySQL está escrito en inglés, y esta traducción no necesariamente está tan actualizada como la versión original. Para cualquier sugerencia sobre la traducción y para señalar errores de cualquier tipo, no dude en dirigirse a mysql-es@vespito.com.
