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'


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow