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