Listado completo de tutoriales

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


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.

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

La tabla "libros" contiene un nuevo campo "editorial" con todos los registros con valor "null".

Ahora debemos actualizar los valores para ese campo.

Podemos hacerlo en 2 pasos:

1º paso: consultamos los códigos de las editoriales:

 select codigo,nombre
  from editoriales;

obtenemos una salida similar a la siguiente:

	codigo	nombre
	_____________
 	1	Planeta
	2	Emece
	3	Paidos

2º paso: comenzamos a actualizar el campo "editorial" de los registros de "libros" uno a uno:

 update libros set editorial='Planeta'
  where codigoeditorial=1;
 update libros set editorial='Emece'
  where codigoeditorial=2;
 update libros set editorial='Paidos'
  where codigoeditorial=3; 
 ... con cada editorial...

Luego, eliminamos 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" (paso 1 y 2 en una sola sentencia):

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

Luego, eliminamos el campo "codigoeditorial" de "libros" con "alter table" y la tabla "editoriales" con "drop table".

Entonces, se puede actualizar una tabla con valores de otra tabla. Se coloca "update" junto al nombre de la tabla a actualizar, luego se realiza el "join" y el campo por el cual se enlazan las tablas y finalmente se especifica con "set" el campo a actualizar y su nuevo valor, que es el campo de la otra tabla con la cual se enlazó.

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

 alter table libros add editorial varchar(20);

 describe libros;

 select * from libros;

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

 select * from libros;

 alter table libros drop codigoeditorial;

 drop table editoriales;

 select * from libros;

Genera una salida similar a esta:

MySQL update con valores de otra tabla

Retornar