MySQL
BORRAR
Buscar..
Sintaxis
- ELIMINAR [LOW_PRIORITY] [QUICK] [IGNORE] FROM table [WHERE conditions] [ORDER BY expression [ASC | DESC]] [LIMIT number_rows]; /// Sintaxis para eliminar filas de una sola tabla
Parámetros
Parámetro | Detalles |
---|---|
BAJA PRIORIDAD | Si se proporciona LOW_PRIORITY , la eliminación se retrasará hasta que no haya procesos leyendo de la tabla |
IGNORAR | Si se proporciona IGNORE , todos los errores encontrados durante la eliminación se ignoran |
mesa | La tabla de la que va a borrar los registros. |
Donde las condiciones | Las condiciones que deben cumplirse para que los registros sean eliminados. Si no se proporcionan condiciones, todos los registros de la tabla se eliminarán |
ORDEN POR expresión | Si se proporciona ORDER BY , los registros se eliminarán en el orden dado |
LÍMITE | Controla el número máximo de registros para eliminar de la tabla. Dados number_rows serán eliminados. |
Eliminar con la cláusula Where
DELETE FROM `table_name` WHERE `field_one` = 'value_one'
Esto eliminará todas las filas de la tabla donde el contenido de field_one
para esa fila coincida con 'value_one'
La cláusula WHERE
funciona de la misma manera que una selección, por lo que se pueden usar cosas como >
, <
, <>
o LIKE
.
Aviso: Es necesario usar cláusulas condicionales (WHERE, LIKE) en la consulta de eliminación. Si no utiliza ninguna cláusula condicional, se eliminarán todos los datos de esa tabla.
Eliminar todas las filas de una tabla
DELETE FROM table_name ;
Esto borrará todo, todas las filas de la tabla. Es el ejemplo más básico de la sintaxis. También muestra que las sentencias DELETE
deben usarse con mucho cuidado, ya que pueden vaciar una tabla, si se omite la cláusula WHERE
.
LIMITAR eliminaciones
DELETE FROM `table_name` WHERE `field_one` = 'value_one' LIMIT 1
Esto funciona de la misma manera que en el ejemplo 'Eliminar con cláusula Where', pero detendrá la eliminación una vez que se haya eliminado el número limitado de filas.
Si está limitando filas para su eliminación de esta manera, tenga en cuenta que eliminará la primera fila que coincida con los criterios. Es posible que no sea la esperada, ya que los resultados pueden aparecer sin clasificar si no están ordenados explícitamente.
Eliminaciones de tablas múltiples
La sentencia DELETE
de MySQL puede usar la construcción JOIN
, permitiendo también especificar de qué tablas eliminar. Esto es útil para evitar consultas anidadas. Dado el esquema:
create table people
( id int primary key,
name varchar(100) not null,
gender char(1) not null
);
insert people (id,name,gender) values
(1,'Kathy','f'),(2,'John','m'),(3,'Paul','m'),(4,'Kim','f');
create table pets
( id int auto_increment primary key,
ownerId int not null,
name varchar(100) not null,
color varchar(100) not null
);
insert pets(ownerId,name,color) values
(1,'Rover','beige'),(2,'Bubbles','purple'),(3,'Spot','black and white'),
(1,'Rover2','white');
carné de identidad | nombre | género |
---|---|---|
1 | Kathy | F |
2 | Juan | metro |
3 | Pablo | metro |
4 | Kim | F |
carné de identidad | ownerId | nombre | color |
---|---|---|---|
1 | 1 | Vagabundo | beige |
2 | 2 | Burbujas | púrpura |
4 | 1 | Rover2 | blanco |
Si queremos eliminar a las mascotas de Paul, la declaración
DELETE p2
FROM pets p2
WHERE p2.ownerId in (
SELECT p1.id
FROM people p1
WHERE p1.name = 'Paul');
Se puede reescribir como
DELETE p2 -- remove only rows from pets
FROM people p1
JOIN pets p2
ON p2.ownerId = p1.id
WHERE p1.name = 'Paul';
1 fila eliminada
El spot se ha eliminado de Pets.
p1
y p2
son alias para los nombres de tabla, especialmente útiles para nombres de tabla largos y facilidad de lectura.
Para eliminar tanto a la persona como a la mascota:
DELETE p1, p2 -- remove rows from both tables
FROM people p1
JOIN pets p2
ON p2.ownerId = p1.id
WHERE p1.name = 'Paul';
2 filas eliminadas
El spot se ha eliminado de Pets.
Paul es eliminado de People
llaves extranjeras
Cuando la instrucción DELETE incluye tablas con una clave extranjera, el optimizador puede procesar las tablas en un orden que no sigue la relación. Añadiendo, por ejemplo, una clave externa a la definición de pets
ALTER TABLE pets ADD CONSTRAINT `fk_pets_2_people` FOREIGN KEY (ownerId) references people(id) ON DELETE CASCADE;
el motor puede intentar eliminar las entradas de las people
antes que las pets
, lo que provoca el siguiente error:
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`test`.`pets`, CONSTRAINT `pets_ibfk_1` FOREIGN KEY (`ownerId`) REFERENCES `people` (`id`))
La solución en este caso es eliminar la fila de las people
y confiar en las capacidades ON DELETE
InnoDB
para propagar la eliminación:
DELETE FROM people
WHERE name = 'Paul';
2 filas eliminadas
Paul es eliminado de People
El spot se borra en cascada de las mascotas
Otra solución es deshabilitar temporalmente la verificación de las teclas externas:
SET foreign_key_checks = 0;
DELETE p1, p2 FROM people p1 JOIN pets p2 ON p2.ownerId = p1.id WHERE p1.name = 'Paul';
SET foreign_key_checks = 1;
Eliminación básica
DELETE FROM `myTable` WHERE `someColumn` = 'something'
La cláusula WHERE
es opcional pero sin ella se eliminan todas las filas.
DELETE vs TRUNCATE
TRUNCATE tableName;
Esto eliminará todos los datos y restablecerá el índice AUTO_INCREMENT
. Es mucho más rápido que DELETE FROM tableName
en un gran conjunto de datos. Puede ser muy útil durante el desarrollo / prueba.
Cuando trunca una tabla, el servidor SQL no borra los datos, elimina la tabla y la vuelve a crear, por lo que desasigna las páginas para que pueda recuperar los datos truncados antes de las páginas sobrescritas. (El espacio no se puede recuperar inmediatamente para innodb_file_per_table=OFF
).
Multi-mesa BORRAR
MySQL permite especificar de qué tabla deben eliminarse las filas coincidentes
-- remove only the employees
DELETE e
FROM Employees e JOIN Department d ON e.department_id = d.department_id
WHERE d.name = 'Sales'
-- remove employees and department
DELETE e, d
FROM Employees e JOIN Department d ON e.department_id = d.department_id
WHERE d.name = 'Sales'
-- remove from all tables (in this case same as previous)
DELETE
FROM Employees e JOIN Department d ON e.department_id = d.department_id
WHERE d.name = 'Sales'