Listado completo de tutoriales
82 - Borrar registros en cascada (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.
La tabla "libros" tiene la siguiente estructura:
-codigo: int unsigned auto_increment, -titulo: varchar(30), -autor: varchar(30), -codigoeditorial: tinyint unsigned, -clave primaria: codigo.
La tabla "editoriales" tiene esta estructura:
-codigo: tinyint unsigned auto_increment, -nombre: varchar(20), -clave primaria: codigo.
Ambas tablas contienen registros.
La librería ya no trabaja con la editorial "Emece", entonces quiere eliminar dicha editorial de la tabla "editoriales" y todos los libros de "libros" de esta editorial. Podemos hacerlo en 2 pasos:
1º paso: buscar el código de la editorial "Emece" y almacenarlo en una variable:
select @valor:= codigo from editoriales where nombre='Emece';
2º paso: eliminar dicha editorial de la tabla "editoriales":
delete editoriales where codigo=@valor;
3º paso: eliminar todos los libros cuyo código de editorial sea igual a la variable:
delete libros where codigoeditorial=@valor;O podemos hacerlo en una sola consulta:
delete libros,editoriales from libros join editoriales on libros.codigoeditorial=editoriales.codigo where editoriales.nombre='Emece';
La sentencia anterior elimina de la tabla "editoriales" la editorial "Emece" y de la tabla "libros" todos los registros con código de editorial correspondiente a "Emece".
Es decir, podemos realizar la eliminación de registros de varias tablas (en cascada) empleando "delete" junto al nombre de las tablas de las cuales queremos eliminar registros y luego del correspondiente "join" colocar la condición "where" que afecte a los registros a eliminar.
Ingresemos al programa "Workbench" y ejecutemos el siguiente bloque de instrucciones SQL:
drop table if exists libros, editoriales; 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) ); insert into editoriales values(1,'Planeta'); insert into editoriales values(2,'Emece'); insert into editoriales values(3,'Paidos'); 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); -- Borrar la editorial "Emece" y todos los libros de "libros" de esta editorial: delete libros,editoriales from libros join editoriales on libros.codigoeditorial=editoriales.codigo where editoriales.nombre='Emece'; select * from editoriales; select * from libros;
Genera una salida similar a esta: