Eliminar con Join en MySQL
-
Limitaciones en el uso de la instrucción
DELETE FROM
en MySQL -
Usando el método
INNER JOIN
en MySQL -
El resultado final al usar
JOIN
para borrar con MySQL
Este artículo del tutorial le mostrará cómo eliminar datos en varias tablas usando el método JOIN
de MySQL. Esto es útil cuando elimina simultáneamente registros en una tabla relacionados con un registro específico en otra.
Limitaciones en el uso de la instrucción DELETE FROM
en MySQL
La declaración DELETE FROM
se usa para eliminar filas en una tabla. Puede aplicar DÓNDE
para especificar las filas y las condiciones que se deben cumplir al eliminar.
El siguiente código contiene dos tablas, la primera que registra los productos del proveedor y su ubicación, y la segunda con una lista de los dueños de las tiendas que venden estos productos:
Create Table supplier (
suppId INTEGER PRIMARY KEY,
category TEXT NOT NULL,
location TEXT NOT NULL
);
Create Table shops (
owner TEXT NOT NULL,
shptype TEXT NOT NULL,
area TEXT NOT NULL
);
INSERT INTO supplier VALUES (0001, 'Veggies', 'Downtown');
INSERT INTO supplier VALUES (0002, 'Fruits', 'Downtown');
INSERT INTO supplier VALUES (0003, 'Dairy', 'Downtown');
INSERT INTO supplier VALUES (0004, 'Veggies', 'Uptown');
INSERT INTO supplier VALUES (0005, 'Fruits', 'Uptown');
INSERT INTO supplier VALUES (0006, 'Dairy', 'Uptown');
INSERT INTO shops VALUES ('Mark', 'Veggies', 'Downtown');
INSERT INTO shops VALUES ('Mark', 'Fruits', 'Downtown');
INSERT INTO shops VALUES ('Susan', 'Dairy', 'Downtown');
Todas las tiendas de la tabla están ubicadas en el centro de la ciudad, por lo que en este caso no tiene sentido mantener registros de proveedores en el área Uptown
.
El uso de DELETE
solo funcionará para una mesa a la vez. Puede tomar datos de la tabla shops
, especificar criterios y eliminar todos los registros de la tabla supplier
que cumplan todas las condiciones.
En este caso, eliminaremos todos los registros de Uptown
de la tabla supplier
usando JOIN
.
Usando el método INNER JOIN
en MySQL
El uso del método INNER JOIN
le permitirá fusionar dos o más tablas y eliminar varias filas de una sola vez.
Existen opciones alternativas, como el uso de subconsultas, pero esta es una forma más práctica de hacer el trabajo. Usando las tablas de ejemplo anteriores, puede eliminar todas las filas en ambas tablas que tienen el valor Uptown
.
El siguiente código buscará la ubicación de las tiendas y mantendrá a los proveedores en la zona Centro
mientras elimina los proveedores registrados como Uptown
:
DELETE supplier FROM supplier
INNER JOIN shops ON supplier.category = shops.shptype
WHERE supplier.location != shops.location;
La unión de tablas se basó en campos que compartían datos similares. El campo de categoría mostró qué proveedores proporcionaron y qué tiendas vendieron en este caso.
Fusionar las dos tablas le permitirá definir solo una condición para la eliminación. En este caso, la ubicación del proveedor determinará qué fila se eliminará.
También puede eliminar ambas tablas simultáneamente simplemente agregando el nombre de la tabla después de DELETE
. Esto funcionará si tiene varios registros en más de una tabla.
DELETE supplier, shops FROM supplier
...
El resultado final al usar JOIN
para borrar con MySQL
El resultado dejará sus tablas intactas y, al mismo tiempo, eliminará todos los registros de proveedores que no cumplan con los criterios mencionados anteriormente.
Create Table supplier (
suppId INTEGER PRIMARY KEY,
category TEXT NOT NULL,
location TEXT NOT NULL
);
Create Table shops (
owner TEXT NOT NULL,
shptype TEXT NOT NULL,
location TEXT NOT NULL
);
INSERT INTO supplier VALUES (0001, 'Veggies', 'Downtown');
INSERT INTO supplier VALUES (0002, 'Fruits', 'Downtown');
INSERT INTO supplier VALUES (0003, 'Dairy', 'Downtown');
INSERT INTO supplier VALUES (0004, 'Veggies', 'Uptown');
INSERT INTO supplier VALUES (0005, 'Fruits', 'Uptown');
INSERT INTO supplier VALUES (0006, 'Dairy', 'Uptown');
INSERT INTO shops VALUES ('Mark', 'Veggies', 'Downtown');
INSERT INTO shops VALUES ('Mark', 'Fruits', 'Downtown');
INSERT INTO shops VALUES ('Susan', 'Dairy', 'Downtown');
-- delete function
DELETE supplier FROM supplier
INNER JOIN shops ON supplier.category = shops.shptype
WHERE supplier.location != shops.location;
Lo anterior hace coincidir todos los proveedores con las tiendas por ubicación, Downtown
en este caso, y elimina todas las filas de la tabla de proveedores que no coinciden con los criterios.
De la siguiente prueba SELECT
, podemos ver que la tabla proveedor
ahora solo contiene proveedores enumerados como Downtown
:
SELECT * FROM supplier
Salir: