Sentencias de manipulación de datos








13.2.1. Sintaxis de
DELETE






Sintaxis para una tabla:


         DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name

[WHERE where_definition]
[ORDER BY ...]
[LIMIT row_count]

 


Sintaxis para múltiples tablas:


       DELETE [LOW_PRIORITY] [QUICK] [IGNORE]

tbl_name[.*] [, tbl_name[.*] ...]
FROM table_references
[WHERE where_definition]

O:


       DELETE [LOW_PRIORITY] [QUICK] [IGNORE]

FROM tbl_name[.*] [, tbl_name[.*] ...]
USING table_references
[WHERE where_definition]

DELETE borra los registros de
tbl_name que satisfacen la
condición dada por where_definition,
y retorna el número de registros borrados.


Si realiza un comando DELETE sin
cláusula WHERE se borran todos los
registros. Una forma más rápida de hacerlo, cuando no quiere saber
el número de registros borrados, se usa
TRUNCATE TABLE
. Consulte

Sección 13.2.9, ?Sintaxis de TRUNCATE?
.


Si borra el registro conteniendo el máximo valor para una columna
AUTO_INCREMENT , el valor se reúsa para
una tabla BDB , pero no para tablas
MyISAM o InnoDB
. Si borra todos los registros en la tabla con
DELETE FROM tbl_name

(sin cláusula WHERE ) en modo
AUTOCOMMIT , la secuencia comienza para
todos los tipos de tabla excepto para InnoDB
y MyISAM. Hay algunas excepciones para
este comportamiento para tablas InnoDB
, como se discute en

Sección 15.6.3, ?Cómo funciona una columna
AUTO_INCREMENT
en InnoDB?
.


Para tablas MyISAM y
BDB , puede especificar una columna
AUTO_INCREMENT secundaria en una clave
de múltiples columnas. En este caso, el reúso de valores borrados
del inicio de la secuencia se realiza incluso para tablas
MyISAM . Consulte

Sección 3.6.9, ?Utilización de AUTO_INCREMENT?
.


El comando DELETE soporta los
siguientes modificadores:




Si especifica LOW_PRIORITY,
la ejecución de DELETE se
retarda hasta que no hay más clientes leyendo de la tabla.

Para tablas MyISAM , si usa
la palabra QUICK , el motor de
almacenamiento no mezcla las hojas del índice durante el
borrado, que puede acelerar algunos tipos de operaciones de
borrado.
En MySQL 5.0, la palabra clave
IGNORE
hace que MySQL ignore todos los errores
durante el proceso de borrar registros. (Los errores
encontrados durante la etapa de parseo se procesan de la
forma habitual.) Los errores que se ignoran debido al uso de
esta opción se retornan como advertencias.


La velocidad de las operaciones de borrado pueden verse afectadas
por factores discutidos en

Sección 7.2.16, ?Velocidad de sentencias
DELETE
?
.


En tablas MyISAM , los registros
borrados se mantienen en una lista enlazada y las operaciones
INSERT siguientes reúsan antiguas
posiciones de registro. Para reclamar espacio no usado y reducir
tamaño de fichero, use el comando OPTIMIZE
TABLE
o la utilidad myisamchk
para reorganizar las tablas. OPTIMIZE TABLE
es más sencillo, pero myisamchk es
más rápido. Consulte

Sección 13.5.2.5, ?Sintaxis de OPTIMIZE TABLE?

y

Sección 5.8.3.10, ?Optimización de tablas?
.


El modificador QUICK afecta si las
hojas del índice es mezclan en operaciones de borrado.
DELETE QUICK es más útil para
aplicaciones en que los valores del índice para registros borrados
se replazan con valores similares de registros insertados
posteriormente. En este caso, los agujeros dejados por los valores
borrados se reúsan.


DELETE QUICK no es útil cuando los
valores borrados conducen a bloques de índices no rellenos con un
rango de valores índice para el que vuelven a ocurrir nuevas
inserciones. En este caso, el uso de QUICK
puede conducir a un gasto de espacio que queda sin reclamar. Aquí
hay un ejemplo de este escenario:




Cree una tabla que contenga una columna
AUTO_INCREMENT indexada.
Inserta varios registros en la tabla. Cada inserción
resulta en un valor índice que se añade al final del índice.

Borra un bloque de registros al final del rango de la
columna usando DELETE QUICK.



En este escenario, los bloques de índice asociados con los
valores de índice borrado quedan sin rellenar pero no se mezclan con
otros bloques de índice debido al uso de QUICK.
Quedan sin rellenar cuando hay nuevas inserciones, ya que los nuevos
registros no tienen valores índice en el rango borrado. Además,
quedan sin rellenar incluso si luego usa
DELETE
sin QUICK, a no ser que
algunos de los valores de índice borrados estén en los bloques de
índice dentro o adyacentes a los bloques no rellenos. Para reclamar
el espacio de índice sin usar bajo estas circunstancias use
OPTIMIZE TABLE.


Si va a borrar varios registros de una tabla, puede ser más
sencillo usar DELETE QUICK seguido por
OPTIMIZE TABLE. Esto reconstruye el
índice en lugar de realizar varias operaciones de mezcla de bloques
de índice.


La opción de MySQL LIMIT
row_count
para
DELETE le dice al servidor el máximo
número de registros a borrar antes de retornar el control al
cliente. Esto puede usarse para asegurar que un comando
DELETE específico no tarada demasiado
tiempo. Puede simplemente repetir el comando
DELETE
hasta que el número de registros afectados sea menor
que el valor LIMIT .


Si el comando DELETE incluye una
cláusula ORDER BY , los registros se
borran en el orden especificado por la cláusula. Esto es muy útil
sólo en conjunción con LIMIT. Por
ejemplo, el siguiente ejemplo encuentra registros coincidentes con
la cláusula WHERE ordenados por
timestamp_column, y borra el primero
(el más viejo).


DELETE FROM somelog

WHERE user = 'jcole'
ORDER BY timestamp_column
LIMIT 1;

Puede especificar múltiples tablas en un comando
DELETE para borrar registros de una o
más tablas dependiendo de una condición particular en múltiples
tablas. Sin embargo, no puede usar ORDER BY
o LIMIT en un
DELETE
de múltiples tablas.


La parte table_references
lista las tablas involucradas en el join. Esta sintaxis se describe
en

Sección 13.2.7.1, ?Sintaxis de JOIN?
.


Para la primera sintaxis, sólo los registros coincidentes de las
tablas listadas antes de la cláusula FROM
se borran. Para la segunda sintaxis, sólo los registros coincidentes
de las tablas listadas en la cláusula FROM
(antes de la cláusula USING ) se
borran. El efecto es que puede borrar registros para varias tablas
al mismo tiempo y tienen tablas adicionales que se usan para buscar:


DELETE t1, t2 FROM t1, t2, t3 WHERE t1.id=t2.id AND t2.id=t3.id;


O:


DELETE FROM t1, t2 USING t1, t2, t3 WHERE t1.id=t2.id AND t2.id=t3.id;


Estos comandos usan las tres tablas al buscar registros a borrar,
pero borrar los registros coincidentes sólo para las tablas
t1 y t2.


Los ejemplos anteriores muestran inner joins usando el operador
coma, pero comandos DELETE de varias
tablas pueden usar cualquier tipo de join permitido por comandos
SELECT tales como
LEFT JOIN
.


La sintaxis permite .* tras los
nombres de tabla para compatibilidad con
Access
.


Si usa un comando DELETE de varias
tablas incluyendo tablas InnoDB para
las que hay restricciones de clave foránea, el optimizador MySQL
puede procesar tablas en un orden ditinto del de su relación
padre/hijo. En este caso, el comando falla y se deshace. En su
lugar, debe borrar de una tabla úncia y confiar en la capacidad de
ON DELETE que proporciona
InnoDB para hacer que las otras tablas
se modifiquen correctamente.


Nota: En MySQL 5.0,
debe usar el alias (si se dió) al referirse a un nombre de tabla:


En MySQL 4.1:


DELETE t1 FROM test AS t1, test2 WHERE ...


Borrados cruzados entre bases de datos se soportan para borrados
de varias tablas, pero en este caso, debe referirse a las tablas sin
usar alias. Por ejemplo:


DELETE test1.tmp1, test2.tmp2 FROM test1.tmp1, test2.tmp2 WHERE ...


Actualmente, no puede borrar desde una tabla y seleccionar de la
misma tabla en una subconsulta.






13.2.2. Sintaxis de
DO






       DO expr [, expr] ...


DO ejecuta la expresión pero no
retorna ningún resultado. Esto es una abreviación de
SELECT expr,
...
, pero tiene la ventaja que es más rápido cuando no le
importa el resultado.


DO es útil principalmente con
funciones que tienen efectos colaterales, tales como
RELEASE_LOCK().






13.2.3. Sintaxis de
HANDLER






HANDLER tbl_name OPEN [ AS alias ]

HANDLER tbl_name READ index_name { = | >= | <= | < } (value1,value2,...)
[ WHERE where_condition ] [LIMIT ... ]
HANDLER tbl_name READ index_name { FIRST | NEXT | PREV | LAST }
[ WHERE where_condition ] [LIMIT ... ]
HANDLER tbl_name READ { FIRST | NEXT }
[ WHERE where_condition ] [LIMIT ... ]
HANDLER tbl_name CLOSE

El comando HANDLER proporciona
acceso directo a las interfaces del motor de la tabla. En MySQL 5.0,
está disponible para tablas MyISAM y
InnoDB .


El comando HANDLER ... OPEN abre una
tabla, haciéndola accesible mediante posteriores comandos
HANDLER ... READ . Este objeto de tabla
no se comparte con otros flujos y no se cierra hasta que el flujo
llama HANDLER ... CLOSE o el flujo
termina. Si abre la tabla usando un alias, referencias posteriores a
la tabla con otros comandos HANDLER
deben usar el alias en lugar del nombre de la tabla.


La primera sintaxis HANDLER ... READ
recibe un registro donde el índice especificado satisface los
valores dados y la condición WHERE se
cumple. Si tiene un índice de múltiples columnas, especifique los
valores de la columna índice como una lista separada por comas. Los
valores epecificados para todas las columnas en el índice, o los
valores específicos para un prefijo a la izquierda de las columnas
índice. Suponga que un índice incluye tres columnas llamadas
col_a, col_b,
y col_c, en ese orden. El comando
HANDLER puede especificar valores para
las tres columnas en el índice, o para las columnas en el prefijo a
la izquierda. Por ejemplo:


HANDLER ... index_name = (col_a_val,col_b_val,col_c_val) ...

HANDLER ... index_name = (col_a_val,col_b_val) ...
HANDLER ... index_name = (col_a_val) ...

La segunda sintaxis HANDLER ... READ
recibe un registro de la tabla en orden del índice que cumple la
condición WHERE .


La tercera sintaxis HANDLER ... READ
recibe un registro de la tabla en orden de registro natural que
cumple la condición WHERE . Es más
rápido que HANDLER
tbl_name
READ index_name
cuando se desea un
escaneo completo de tabla. El orden de registro natural es el orden
en que se almacenan los registros en un fichero de datos de una
tabla MyISAM. Este comando funciona
para tablas InnoDB también, pero no hay
tal concepto porque no hay un fichero de datos separado.


Sin una cláusula LIMIT , todas las
formas de HANDLER ... READ reciben un
único registros si una está disponible. Para retornar un número
específico de registros, incluya una cláusula
LIMIT
. Tiene la misma sintaxis que para el comando
SELECT . Consulte

Sección 13.2.7, ?Sintaxis de SELECT?
.


HANDLER ... CLOSE cierra una tabla
que se abrió con HANDLER ... OPEN.


Nota: Para emplear la
interfaz HANDLER para referirse a una
tabla PRIMARY KEY, use el identificador
`PRIMARY` entrecomillado:


  HANDLER tbl_name READ `PRIMARY` > (...);


HANDLER es un comando de bajo nivel.
Por ejemplo, no proporciona consistencia. Esto es,
HANDLER ... OPEN
no
toma una muestra de la tabla, y
no bloquea la tabla. Esto
significa que tras un comando HANDLER ... OPEN
realizado, los datos de la tabla pueden ser modificados (por este o
por otro flujo) y estas modificaciones pueden aparecer sólo
parcialmente en escaneos HANDLER ... NEXT
o HANDLER ... PREV .


Hay varias razones para usar la interfaz
HANDLER
en lugar de comandos SELECT
normales:




HANDLER es más rápido que
SELECT:


Un objeto de tratamiento de motor de
almacenamiento designado se reserva para
HANDLER ... OPEN. El
objeto se reúsa para posteriores comandos
HANDLER para esa tabla;
no necesita reinicializarse para cada una.
Hay menos parseo.
No hay sobrecarga del chequeo de consultas ni
optimizador.
La tabla no tiene que estar bloqueada entre
peticiones.
La interficie del handler no tiene que
propocionar una vista de los datos consistente (por
ejemplo, se permiten dirty reads), así que el motor
puede usar optimización que
SELECT
no permite.



HANDLER hace mucho más
fácil portar aplicaciones que usen una interfaz tipo
ISAM a MySQL.
HANDLER le permite
consultar una base de datos de forma difícil o imposible de
realizar con SELECT. La
interfície de HANDLER es una
forma más natural de consultar los datos cuando se trabaja
con aplicaciones que proporcionan una interfaz de usuario
interactiva a la base de datos.







13.2.4. Sintaxis de
INSERT








INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]

[INTO] tbl_name [(col_name,...)]
VALUES ({expr | DEFAULT},...),(...),...
[ ON DUPLICATE KEY UPDATE col_name=expr, ... ]

O:


INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]

[INTO] tbl_name
SET col_name={expr | DEFAULT}, ...
[ ON DUPLICATE KEY UPDATE col_name=expr, ... ]

O:


INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]

[INTO] tbl_name [(col_name,...)]
SELECT ...
[ ON DUPLICATE KEY UPDATE col_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
tbl_name

para encontrarlo.


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(col_name)
como forma más general que puede usarse en expresiones para
producir un valor por defecto de una columna.


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 INTO tbl_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 INTO tbl_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.3.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 un registro se inerta que haría que un valor duplicado 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.3.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.3.3.32, ?mysql_info()?
.








13.2.4.1. Sintaxis de
INSERT ... SELECT





INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]

[INTO] tbl_name [(col_name,...)]
SELECT ...
[ ON DUPLICATE KEY UPDATE col_name=expr, ... ]

Con INSERT ... SELECT, puede
insertar rápidamente varios registros en un atabla desde una o
varias tablas.


Por ejemplo:


INSERT INTO tbl_temp2 (fld_id)

SELECT tbl_temp1.fld_order_id
FROM tbl_temp1 WHERE tbl_temp1.fld_order_id > 100;

La siguiente condición sirve para un comando
INSERT ... SELECT :




En MySQL 5.0, especifique
IGNORE
explícitamente para ignorar registros que
causarían violaciones de clave duplicada.
No use DELAYED con
INSERT ... SELECT.
En MySQL 5.0, la tabla objetivo del comando
INSERT puede aparecer en la
cláusula FROM de la parte
SELECT de la consulta.
(Esto no era posible en algunas versiones antiguas de
MySQL.)
Las columnas AUTO_INCREMENT
funcionan normalmente.
Para asegurar que el log binario puede usarse para
recrear las tablas originales, MySQL no permite
inserciones concurrentes durante
INSERT ... SELECT
.
Actualmente, no puede insertar en una tabla y
seleccionar de la misma tabla en una subconsulta.


En las partes de valores de ON
DUPLICATE KEY UPDATE
puede referirse a una columna en
otras tablas, mientras no use GROUP BY
en la parte SELECT . Un efecto
lateral es que debe calificar los nombres de columna no únicos
en la parte de valores.


Puede usar REPLACE en lugar de
INSERT para sobreescribir registros
antiguos REPLACE es la contraparte
de INSERT IGNORE en el tratamiento
de nuevos registros que contienen valores de clave única que
duplican registros antiguos: Los nuevos registros se usan para
reemplazar los antiguos registros en lugar de descartarlos.






13.2.4.2. Sintaxis de
INSERT DELAYED








         INSERT DELAYED ...


La opción DELAYED para el
comando INSERT es una extensión de
MySQL del estándar SQL muy útil si tiene clientes que no pueden
esperar a que se complete el INSERT
. Este es un problema común cuando usa MySQL para loguear y
periódicamente ejecuta comandos SELECT
y UPDATE que tardan mucho tiempo en
completarse.


Cuando un cliente usa INSERT DELAYED,
obtiene un ok del servidor una vez, y el registro se encola para
insertarse cuando la tabla no está en uso por otro flujo.


Otro beneficio de usar INSERT DELAYED
es que las inserciones desde varios clientes se tratan juntas y
se escriben en un bloque. Esto es mucho más rápido que realizar
inserciones separadas.


Hay algunas restricciones al uso de
DELAYED
:




En MySQL 5.0, INSERT DELAYED
funciona sólo con tablas MyISAM
y MEMORY . Para tablas
MyISAM , si no hay bloques
libres en medio del fichero de datos, se soportan
comandos SELECT y
INSERT concurrentes. Bajo
estas circunstáncias, muy raramente necesitará usar
INSERT DELAYED con
MyISAM. Consulte

Sección 14.1, ?El motor de almacenamiento
MyISAM?
y

Sección 14.3, ?El motor de almacenamiento
MEMORY (HEAP)?
.

En MySQL 5.0, INSERT DELAYED
debe usarse sólo para comandos
INSERT
que especifiquen una lista de valores. El
servidor ignora DELAYED
para comandos INSERT DELAYED ...
SELECT
.
El servidor ignora DELAYED
para comandos INSERT DELAYED ...
ON DUPLICATE UPDATE
.
Debido a que el comando retorna inmediatamente antes
que los registros se inserten, no puede usar
LAST_INSERT_ID() para
obtener el valor AUTO_INCREMENT
que el comando genera.
Los registros DELAYED
no son visibles por los comandos
SELECT
hasta que se hayan insertado realmente.

DELAYED se ignora en la
replicación de esclavos porque puede causar que el
esclavo tenga distintos datos que el maestro.


Tenga en cuenta que los registros encolados se tratan sólo en
memoria hasta que se insertan en la tabla. Esto significa que si
termina mysqld forzadamente
(por ejemplo, con kill -9) o si
mysqld muere inesperadamente,
cualquier registro encolado que no se escriba en disco se
pierde.


A continuación se describe en detalle qué ocurre cuando usa
la opción DELAYED con
INSERT o
REPLACE
. En esta descriión, el ?flujo?
es el flujo que recibe un comando INSERT
DELAYED
y ?handler? es el
flujo que trata todos los comandos INSERT
DELAYED
para una tabla particular.




Cuando un flujo ejecuta un comando
DELAYED para una tabla, un
flujo handler se crea para procesar todos los comandos
DELAYED para la tabla, si
tal handler no existía préviamente.
El flujo chequea si el handler ha adquirido
préviamente un bloqueo DELAYED
; si no, le dice al flujo handler que lo haga. El
bloqueo DELAYED puede
obtenerse incluso si otros flujos tienen el bloqueo
READ o
WRITE en la tabla. Sin
embargo, el handler espera a todos los bloqueos
ALTER TABLE o
FLUSH TABLES para asegurar
que la estructura de tabla está actualizada.
El flujo ejecuta el comando
INSERT
, pero en lugar de escribir el registro en
la tabla, pone una copia del registro final en una cola
administrada por el flujo handler. Cualquier error de
sintaxis es detectado por el flujo y se reporta al
programa cliente.
El cliente no puede obtener del servidor el número
de registros duplicados o el valor
AUTO_INCREMENT
del registro resultante, ya que
INSERT retorna antes que se
complete la operación de inserción. (Si usa la API C, la
función mysql_info() no
retorna nada inteligible por la misma razón.)
El log binario se actualiza por parte del flujo
handler cuando el registro se inserta en la tabla. En
caso de inserciones de múltiples registros, el log
binario se actualiza cuando el primer registro se
inserta.
Tras cada delayed_insert_limit
los registros se escriben, el handler chequea si algún
comando SELECT todavía está
pendiente. Si es así, les permite ejecutarse antes de
continuar.

Cuando el handler no tiene más registros en su cola,
la tabla se desbloquea. Si no se reciben nuevos comandos
INSERT DELAYED en
delayed_insert_timeout
segundos, el handler termina.
Si más de delayed_queue_size
registros están pendientes en una cola de handler
específica, el flujo que pida el
INSERT DELAYED
espera hasta que haya espacio en
la cola. Esto se hace para asegurar que
mysqld no usa toda la
memoria para la cola de memoria retrasada.
El flujo handler se muestra en l lista de procesos
MySQL con delayed_insert en
la columna Command . Si
muere si ejecuta un comando FLUSH
TABLES
o puede matarlo con
KILL thread_id
. Sin embargo, antes de salir,
primero almacena todos los registros encolados en la
tabla. Durante esta operación no acepta ningún nuevo
comando INSERT de otros
flujos. Si ejecuta un comando
INSERT DELAYED
a continuación, se crea un nuevo
flujo handler.

Tenga en cuenta que esto significa que comandos
INSERT DELAYED tienen mayor
prioridad que comandos INSERT
normales si hay un handler INSERT
DELAYED
en ejecución. Otros comandos de
actualización tienen que esperar hast que la cola
INSERT DELAYED está vacía,
alguien termine el flujo handler (con
KILL thread_id), o alguien
ejecute un FLUSH TABLES.


Las siguientes variables de estado proporcionan
información acerca de comandos
INSERT DELAYED
:






Variable de
estado

Significado



Delayed_insert_threads

Número de flujos handler


Delayed_writes
Número de registros escritos con
INSERT DELAYED



Not_flushed_delayed_rows

Número de registros esperando a ser
escritos



Puede ver estas variables ejecutando un comando
SHOW STATUS o
mysqladmin extended-status.




Tenga en cuenta que INSERT DELAYED
es más lento que un INSERT normal
si la tabla no está en uso. También hay una sobrecarga adicional
para el servidor debido a que tiene que tratar un flujo separado
para cada tabla en que haya registros retardados. Esto significa
que debe usar INSERT DELAYED sólo
cuando esté realmente seguro que lo necesita.







13.2.5. Sintaxis de
LOAD DATA INFILE






LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name.txt'

[REPLACE | IGNORE]
INTO TABLE tbl_name
[FIELDS
[TERMINATED BY 'string']
[[OPTIONALLY] ENCLOSED BY 'char']
[ESCAPED BY 'char' ]
]
[LINES
[STARTING BY 'string']
[TERMINATED BY 'string']
]
[IGNORE number LINES]
[(col_name_or_user_var,...)]
[SET col_name = expr,...)]

El comando LOAD DATA INFILE lee
registros desde un fichero de texto a una tabla a muy alta
velocidad. El nombre de fichero debe darse como una cadena literal.


Para más información acerca de la eficiencia de
INSERT contra
LOAD DATA INFILE
y acelerar LOAD DATA
INFILE
, consulte

Sección 7.2.14, ?Velocidad de la sentencia
INSERT
?
.


En MySQL 5.0, el conjunto de carácteres indicado por la variable
de sistema character_set_database se
usa para interpretar la información en el fichero.
SET NAMES y el valor de
character_set_client no afecta la
interpretación de la entrada.



Puede cargar ficheros de datos usando la utilidad
mysqlimport ; opera enviando un
comando LOAD DATA INFILE al servidor.
La opción --local hace que
mysqlimport lea ficheros de datos
desde el equipo cliente. Puede especificar la opción
--compress para obtener un mejor
rendimiento en redes lentas si el cliente y el servidor soportan el
protocolo comprimido. Consulte

Sección 8.9, ?El programa para importar datos
mysqlimport?
.


Si usa LOW_PRIORITY, la ejecución
del comando LOAD DATA se retarda hasta
que no haya más clientes leyendo de la tabla.


Si especifica CONCURRENT con una
tabla MyISAM que satisfaga la condición
para inserciones concurrentes (esto es, no contiene bloques libres
en medio), entonces otros flujos pueden recibir datos desde la tabla
mientras se ejecuta LOAD DATA . Usar
esta opción afecta al rendimiento de LOAD DATA
ligeramente, incluso si no hay otro flujo usando la tabla al mismo
tiempo.


Si se especifica LOCAL, se
interpreta respecto al cliente final de la conexión:




Si se especifica
  • 0 Kasutajad peavad seda kasulikuks
Kas see vastus oli kasulik?

Seotud artiklid