81 - Borrar registros buscando coincidencias en otras tablas (delete - join) |
Tenemos la tabla "libros" en la cual almacenamos los datos de los libros de nuestra biblioteca y la tabla "editoriales" que almacena el nombre de las distintas editoriales y sus códigos.
Eliminamos ambas tablas si existen:
drop table if exists libros, editoriales;
Creamos las tablas:
create table libros( codigo int unsigned auto_increment, titulo varchar(40), autor varchar(30), codigoeditorial tinyint unsigned, primary key(codigo) ); create table editoriales( codigo tinyint unsigned auto_increment, nombre varchar(20), primary key(codigo) );
Ingresamos algunos registros:
insert into editoriales values(1,'Planeta'); insert into editoriales values(2,'Emece'); insert into editoriales values(3,'Paidos'); insert into editoriales values(4,'Plaza & Janes'); insert into libros values (1,'El aleph','Borges',2); insert into libros values (2,'Alicia en el pais de las maravillas','Lewis Carroll',1); insert into libros values (3,'Matematica estas ahi','Paenza',2); insert into libros values (4,'Martin Fierro','Jose Hernandez',3); insert into libros values (5,'Martin Fierro','Jose Hernandez',2); insert into libros values (6,'Aprenda PHP','Mario Molina',9);
Queremos eliminar todos los libros cuyo código de editorial no exista en la tabla "editoriales". Podemos hacerlo en 2 pasos: 1) realizamos un left join para ver qué "codigoeditorial" en "libros" no existe en "editoriales", nos retorna el libro con código "5", recordamos el valor, y 2) borramos todos los libros mostrados en la consulta anterior (uno solo, con código 5).
O podemos realizar la eliminación en el mismo momento que realizamos el "left join":
delete libros from libros left join editoriales on libros.codigoeditorial=editoriales.codigo where editoriales.codigo is null;
Veamos si el libro se ha eliminado:
select * from libros;
Eliminemos todas las editoriales de las cuales no haya libros:
delete editoriales from editoriales left join libros on libros.codigoeditorial=editoriales.codigo where libros.codigo is null;
Veamos si se ha eliminado:
select * from editoriales;