Listado completo de tutoriales

79 - Actualización en cascada (update - 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.

Las tablas tienen 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)
 );

Ambas tablas contienen registros.

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":

 select * from editoriales
  where nombre='Emece';

recordamos el valor devuelto (valor 2) o lo almacenamos en una variable;

2) actualizar el código en la tabla "editoriales":

 update editoriales
  set codigo=9
  where nombre='Emece'; 

3) y finalmente actualizar todos los libros de dicha editorial:

 update libros
  set codigoeditorial=9
  where codigoeditorial=2;

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';

El cambio se realizó en ambas tablas.

Si modificamos algún dato de un registro que se encuentra en registros de otras tablas (generalmente campos que son clave ajena) debemos modificar también los registros de otras tablas en los cuales se encuentre ese dato (generalmente clave primaria). Podemos realizar la actualización en cascada (es decir, en todos los registros de todas las tablas que contengan el dato modificado) en una sola sentencia, combinando "update" con "join" y seteando los campos involucrados de todas las tablas.

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,
  precio decimal(5,2) 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 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: 
 update libros as l
  join editoriales as e
  on l.codigoeditorial=e.codigo
  set l.codigoeditorial=9, e.codigo=9
  where e.nombre='Emece';

 select * from libros;

 select * from editoriales;

Genera una salida similar a esta:

MySQL update join en cascada

Retornar