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