Sintaxis para una tabla:
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROMtbl_name
[WHEREwhere_definition
] [ORDER BY ...] [LIMITrow_count
]
Sintaxis para múltiples tablas:
DELETE [LOW_PRIORITY] [QUICK] [IGNORE]tbl_name
[.*] [,tbl_name
[.*] ...] FROMtable_references
[WHEREwhere_definition
]
O:
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROMtbl_name
[.*] [,tbl_name
[.*] ...] USINGtable_references
[WHEREwhere_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
(sin cláusula
tbl_name
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
para
row_count
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.
É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.