78 - Actualizar datos con valores de otra tabla (update)


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

 drop table if exists libros, editoriales;

Creamos las tablas:

 create table libros(
  codigo int unsigned auto_increment,
  titulo varchar(30),
  autor varchar(30),
  codigoeditorial tinyint 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 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);

Queremos unir los datos de ambas tablas en una sola: "libros", es decir, alterar la tabla "libros" para que almacene el nombre de la editorial, no su código y eliminar la tabla "editoriales".

En primer lugar debemos alterar la tabla "libros", vamos a agregarle un campo llamado "editorial" en el cual guardaremos el nombre de la editorial.

 alter table libros add editorial varchar(20);

Si visualizamos la estructura de la tabla:

 describe libros;

vemos que la tabla "libros" contiene un nuevo campo "editorial".

Veamos los registros:

 select * from libros;

vemos que todos los registros tienen el campo "editorial" con valor "null".

Ahora debemos actualizar los valores para ese campo.

Podemos hacerlo en 2 pasos: 1º) consultar los códigos de las editoriales con un "select" y 2º) actualizar el campo "editorial" de los registros de "libros" uno a uno. Luego, eliminar el campo "codigoeditorial" de "libros" y la tabla "editoriales".

Pero podemos simplificar la tarea actualizando el campo "editorial" de todos los registros de la tabla "libros" al mismo tiempo que realizamos el "join" para que localice los códigos de las editoriales (paso 1 y 2 en una sola sentencia). Lo hacemos de esta manera:

  update libros
  join editoriales
  on libros.codigoeditorial=editoriales.codigo
  set libros.editorial=editoriales.nombre;

Veamos cómo quedaron los registros luego de la actualización:

 select * from libros;

Ahora si, eliminamos el campo "codigoeditorial" de "libros":

 alter table libros drop codigoeditorial;

y finalmente eliminamos la tabla "editoriales":

 drop table editoriales;

Veamos todos los registros y todos los campos:

 select * from libros;



Retornar