79 - Actualización en cascada (update - join)


Problema:

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 las tablas si existen:

 drop table if exists libros, editoriales;

Creamos las tablas con las siguientes estructuras:

 create table libros(
  codigo int unsigned auto_increment,
  titulo varchar(30),
  autor varchar(30),
  codigoeditorial tinyint unsigned,
  precio decimal(5,2) 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,44.20);
 insert into libros values (2,'Alicia en el pais de las maravillas','Lewis Carroll',1,12.33);
 insert into libros values (3,'Matematica estas ahi','Paenza',2,9.99);
 insert into libros values (4,'Martin Fierro','Jose Hernandez',3,17.22);
 insert into libros values (5,'Martin Fierro','Jose Hernandez',2,23.56);

Queremos modificar el código de la editorial "Emece" a "9" y también todos los "codigoeditorial" de los libros de dicha editorial. Podemos hacerlo en 3 pasos: 1) buscar el código de la editorial "Emece" (nos retorna 2); 2) actualizar el código en la tabla "editoriales" y 3) actualizar todos los libros de dicha editorial con el valor "9". O podemos hacerlo en una sola sentencia:

 update libros as l
  join editoriales as e
  on l.codigoeditorial=e.codigo
  set l.codigoeditorial=9, e.codigo=9
  where e.nombre='Emece';

Verificamos el cambio en ambas tablas:

 select * from libros;
 select * from editoriales;



Retornar