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.

Servidor de MySQL instalado en forma local.

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:

MySQL delete join en cascada

Retornar