martes, 6 de noviembre de 2012

51 - Modificar campos de una tabla (alter table - modify)



Con "alter table" podemos modificar el tipo de algún campo incluidos sus atributos.

Continuamos con nuestra tabla "libros", definida con la siguiente estructura:


 - código, int unsigned,
 - titulo, varchar(30) not null,
 - autor, varchar(30),
 - editorial, varchar (20),
 - precio, decimal(5,2) unsigned,
 - cantidad int unsigned.

Queremos modificar el tipo del campo "cantidad", como guardaremos valores que 
no superarán los 50000 usaremos smallint unsigned, tipeamos:

 alter table libros
  modify cantidad smallint unsigned;

Usamos "alter table" seguido del nombre de la tabla y "modify" seguido del 
nombre del nuevo campo con su tipo y los modificadores.

Queremos modificar el tipo del campo "titulo" para poder almacenar una longitud de 40 caracteres y que no permita valores nulos, tipeamos:

 alter table libros
  modify titulo varchar(40) not null;

Hay que tener cuidado al alterar los tipos de los campos de una tabla que ya 
tiene registros cargados. Si tenemos un campo de texto de longitud 50 y lo 
cambiamos a 30 de longitud, los registros cargados en ese campo que superen los 
30 caracteres, se cortarán.

Igualmente, si un campo fue definido permitiendo valores nulos, se cargaron registros con valores nulos y luego se lo define "not null", todos los registros con valor nulo para ese campo cambiarán al valor por defecto según el tipo (cadena vacía para tipo texto y 0 para numéricos), ya que "null" se convierte en un valor inválido.

Si definimos un campo de tipo decimal(5,2) y tenemos un registro con el valor "900.00" y luego modificamos el campo a "decimal(4,2)", el valor "900.00" se convierte en un valor inválido para el tipo, entonces guarda en su lugar, el valor límite más cercano, "99.99".

Si intentamos definir "auto_increment" un campo que no es clave primaria, aparece un mensaje de error indicando que el campo debe ser clave primaria. Por ejemplo:

 alter table libros
  modify codigo int unsigned auto_increment;

"alter table" combinado con "modify" permite agregar y quitar campos y 
atributos de campos. Para modificar el valor por defecto ("default") de un campo 
podemos usar también "modify" pero debemos colocar el tipo y sus modificadores, 
entonces resulta muy extenso, podemos setear sólo el valor por defecto con la 
siguienmte sintaxis:

 alter table libros
 alter autor set default 'Varios';

Para eliminar el valor por defecto podemos emplear:

 alter table libros
 alter autor drop default;



PROBLEMA RESUELTO


Trabajamos con la tabla "libros" de una librería.
Eliminamos la tabla "libros" si existe.
Creamos la tabla "libros" con la siguiente estructura:
 create table libros(
  codigo int unsigned,
  titulo varchar(30) not null,
  autor varchar(30),
  editorial varchar (20),
  precio decimal(5,2) unsigned,
  cantidad int unsigned
 );
Para modificar el tipo del campo "cantidad" por "smallint unsigned", tipeamos:
 alter table libros
  modify cantidad smallint unsigned;
Si visualizamos la estructura de la tabla:
 describe libros;
vemos la nueva definición del campo "cantidad".
Para modificar el tipo del campo "titulo" para poder almacenar una longitud de 40 caracteres y que no permita valores nulos, tipeamos:
 alter table libros
  modify titulo varchar(40) not null;
Visualicemos la estructura de la tabla:
 describe libros;
Ahora el campo "titulo" permite 40 caracteres de longitud.
Ingresemos algunos registros:
 insert into libros (titulo,autor,editorial,precio,cantidad)
  values ('El aleph','Borges','Planeta',23.5,100);
 insert into libros (titulo,autor,editorial,precio,cantidad)
  values ('Alicia en el pais de las maravillas','Lewis Carroll','Emece',25,200);
 insert into libros (titulo,autor,editorial,precio,cantidad)
  values ('El gato con botas',null,'Emece',10,500);
 insert into libros (titulo,autor,editorial,precio,cantidad)
  values ('Martin Fierro','Jose Hernandez','Planeta',150,200);
Modificamos el tipo de dato de "autor" a 10 caracteres de longitud:
 alter table libros
  modify autor varchar(10);
Mostramos todos los registros:
 select * from libros;
Note que los nombres de los autores que tenían más de 10 caracteres se cortaron.
Modificamos el tipo de dato de "autor" para que no permita valores nulos:
 alter table libros
  modify autor varchar(10) not null;
Mostramos todos los registros:
 select * from libros;
Note que en el campo "autor" del libro "El gato con botas", ahora tiene una cadena vacía, lo habíamos cargado con "null", pero al redefinir el campo como
no nulo, "null" se convirtió en un valor inválido.
El libro "Martín Fierro" tiene un precio de $150; si modificamos el tipo de dato de "precio" a "decimal(4,2), el precio anterior quedará fuera del rango:
 alter table libros
  modify precio decimal(4,2);
Mostramos todos los registros:
 select * from libros,
Note que el valor "150" se convierte en un valor inválido para el tipo, entonces guarda en su lugar, el valor límite más cercano, "99.99".
Si intentamos definir "auto_increment" un campo que no es clave primaria, aparece un mensaje de error indicando que el campo debe ser clave primaria:
 alter table libros
  modify codigo int unsigned auto_increment;
La sentencia no se ejecuta.
PROBLEMA PROPUESTO
Trabaje con la tabla "peliculas" de un video club.

1- Elimine la tabla, si existe.

2- Cree la tabla con la siguiente estructura:
 create table peliculas(
  codigo int unsigned,
  nombre varchar(20) not null,
  actor varchar(20),
  director varchar(25),
  duracion tinyint
 );

3- Modifique el campo "duracion" por tinyint unsigned.
 

4- Modifique el campo "nombre" para poder almacenar una longitud de 40 caracteres   y que no permita valores nulos:
5- Modifique el campo "actor" para que no permita valores nulos:
 
6- Intente definir "auto_increment" el campo "codigo" (mensaje de error):
 

Otros problemas: 

Un comercio que vende artículos de computación registra los datos de sus artículos en una tabla con ese nombre.

1- Elimine "articulos", si existe.

2- Cree la tabla, con la siguiente estructura:
create table articulos(
  codigo int unsigned,
  nombre varchar(25) not null,
  descripcion varchar(30),
  precio decimal(4,2) unsigned,
  cantidad tinyint,
  primary key(codigo)
 );

3- Modifique el campo "precio" para que pueda guardar valores hasta "9999.99".

4- Modifique el campo "codigo" para que se autoincremente.

5- Modifique el campo "cantidad" para que no permita valores negativos.




No hay comentarios:

Publicar un comentario