domingo, 8 de abril de 2012

21 - Valores inválidos.

Hemos visto los valores por defecto de los distintos tipos de datos.

Un valor por defecto se inserta cuando no está presente al ingresar un registro y en algunos casos en que el dato ingresado es inválido.

Un valor es inválido por tener un tipo de dato incorrecto para el campo o por estar fuera de rango.
Veamos los distintos tipos de datos inválidos.

Para campos de tipo caracter:

-valor numérico: si en un campo definido de tipo caracter ingresamos un valor numérico, lo convierte automáticamente a cadena. Por ejemplo, si guardamos 234 en un varchar, almacena '234'.

-mayor longitud: si intentamos guardar una cadena de caracteres mayor a la longitud definida, la cadena se corta guardando sólo la cantidad de caracteres que quepa. Por ejemplo, si definimos un campo de tipo varchar(10) y le asignamos la cadena 'Buenas tardes', se almacenará 'Buenas tar' ajustándose a la longitud 
de 10.

Para campos numéricos:

-cadenas: si en un campo numérico ingresamos una cadena, lo pasa por alto y coloca 0. Por ejemplo, si en un campo de tipo "integer" guardamos 'abc', almacenará 0.

-valores fuera de rango: si en un campo numérico intentamos guardar un valor fuera de rango, se almacena el valor límite del rango más cercano (menor o mayor). Por ejemplo, si definimos un campo 'tinyint' (cuyo rango va de -128 a 127) e intentamos guardar el valor 200, se almacenará 127, es decir el máximo permitido del rango; si intentamos guardar -200, se guardará -128, el mínimo permitido por el rango. Otro ejemplo, si intentamos guardar el valor 1000.00 en un campo definido como decimal(5,2) guardará 999.99 que es el mayor del rango.

-valores incorrectos: si cargamos en un campo definido de tipo decimal un valor con más decimales que los permitidos en la definición, el valor es redondeado al más cercano. Por ejemplo, si cargamos en un campo definido como decimal(4,2) el valor 22.229, se guardará 22.23, si cargamos 22.221 se guardará 22.22.

Para campos definidos auto_increment el tratamiento es el siguiente:

- Pasa por alto los valores fuera del rango, 0 en caso de no ser "unsigned" y todos los menores a 1 en caso de ser "unsigned".

- Si ingresamos un valor fuera de rango continúa la secuencia.

- Si ingresamos un valor existente, aparece un mensaje de error indicando que el valor ya existe.

Para campos de fecha y hora:

-valores incorrectos: si intentamos almacenar un valor que MySql no reconoce como fecha (sea fuera de rango o un valor inválido), convierte el valor en ceros (según el tipo y formato). Por ejemplo, si intentamos guardar '20/07/2006' en un campo definido de tipo "date", se almacena '0000-00-00'. Si intentamos guardar '20/07/2006 15:30' en un campo definido de tipo "datetime", se almacena '0000-00-00 00:00:00'. Si intentamos almacenar un valor inválido en un campo de tipo "time", se guarda ceros. Para "time", si intentamos cargar un valor fuera de rango, se guarda el menor o mayor valor permitido (según sea uno u otro el más cercano).

Para campos de cualquier tipo:

-valor "null": si un campo está definido "not null" e intentamos ingresar "null", aparece un mensaje de error y la sentencia no se ejecuta.

Los valores inválidos para otros tipos de campos lo trataremos más adelante.


Problema Resuelto:

Trabajamos con la tabla "libros" de una librería.

Eliminamos la tabla, si existe:

drop table if exists libros;
 
Creamos la tabla con la siguiente estructura:

create table libros(
  codigo int unsigned auto_increment,
  titulo varchar(20) not null,
  autor varchar(30),
  editorial varchar(15),
  precio decimal(5,2) unsigned,
  cantidad mediumint unsigned not null,
  primary key(codigo)
 );
 
Ingresemos algunos registros con valores inválidos y veamos qué sucede:

insert into libros (titulo,autor,editorial,precio)
 values ('Alicia en el pais de las maravillas',555,'Planeta',23.45);
 
En el campo "titulo" ingresamos una cadena de más de 20 caracteres (que es la longitud definida para el campo), como resultado, corta la cadena ingresada. En el campo "autor" ingresamos un valor numérico, lo convierte a cadena.

Ingresemos otro registro:

insert into libros (titulo,autor,editorial,precio,cantidad)
 values ('Matematica estas ahi','Paenza','Planeta','abc',20000000);
 
En el campo "precio" ingresamos una cadena, la pasa por alto y coloca 0. En el campo "cantidad" ingresamos un valor fuera de rango, entonces guarda el valor límite más cercano del rango (16777215).

Ingresemos otro registro:

insert into libros (titulo,editorial,precio)
 values ('Alegoria','Planeta',3333.50);
 
Como cargamos en el campo "precio" (decimal 5,2) un fuera de rango, almacenó el máximo valor permitido por el rango (999.99).

Ingresemos otro registro:

insert into libros (titulo,editorial,precio)
 values ('Alegoria','Planeta',33.567);
 
Como cargamos en el campo "precio" (decimal 5,2) un valor con más decimales que los permitidos, el valor es redondeado al más cercano (33.57).

Ingresemos otro registro:

insert into libros (codigo,titulo)
 values (2,'El gato con botas');
 
Aparece un mensaje de error indicando que la clave está duplicada.

Ingresemos otros registros:

insert into libros (codigo,titulo)
 values (0,'El gato con botas');
 insert into libros (codigo,titulo)
 values (-5,'Robin Hood');
 
Intentamos ingresar el valor 0 para el código, lo pasa por alto y sigue la secuencia. Lo mismo sucede si ingresamos un valor negativo.

Veamos qué sucede con los valores "null":

insert into libros (codigo,titulo)
 values (null,'Alicia a traves del espejo');
 
Si intentamos ingresar "null" para el código, lo pasa por alto y sigue la secuencia.


Otro ejemplo:

insert into libros (titulo,autor)
 values (null,'Borges');
 
Aparece un mensaje de error indicando que el campo "titulo" no acepta valores nulos.

Otro ejemplo:

insert into libros (titulo,autor,cantidad)
 values ('Antologia poetica','Borges',null);
 
Muestra un mensaje de error indicando que el campo "cantidad" no acepta valores nulos.



Problema Propuesto:
 
Una empresa registra los datos de sus empleados en una tabla llamada 
"empleados".

1- Elimine la tabla "empleados" si existe.

2- Cree la tabla:
 
create table empleados(
  documento char(8) not null,
  nombre varchar(30) not null,
  domicilio varchar(30),
  fechaingreso date not null,
  fechanacimiento date,
  primary key(documento)
);

3- Intente ingresar la fecha "20-10-2005" para la fecha de ingreso:
 
Se almacenan ceros.

4- Intente almacenar "null" en "fechaingreso":
 
Muestra un mensaje de error.

5- Intente almacenar valores nulos en los campos "documento" y " nombre".

6- Almacene un valor numérico en un campo de tipo caracter.

7- Almacene en "documento" el valor "22.345.678".


Otros problemas:

Trabaje con la tabla que almacena los datos sobre películas, llamada 
"peliculas".

1- Elimine la tabla si existe.

2- Créela con la siguiente estructura: 
 
create table peliculas(
  codigo int unsigned auto_increment,
  titulo varchar(15) not null,
  actor varchar(20),
  duracion tinyint unsigned,
  primary key (codigo)
 );

3- Ingrese el siguiente registro: 
 
-10,Mision imposible,Tom Cruise,120

4- Muestre los registros para ver qué valor se guardó en "codigo".

5- Intente ingresar el siguiente registro (error por clave duplicada): 
 
1,Mision imposible 2,Tom Cruise,120

6- Intente ingresar el siguiente registro: 
 
 null,Mision imposible 2,Tom Cruise,120
 
7- Muestre los registros para ver qué valor se guardó en "codigo".

8- Intente ingresar el siguiente registro (no ingresa, el campo 
"título" no admite valores nulos): 
 
3,null,Tom Cruise,120
 
9- Ingrese el siguiente registro: 
 
5,Harry Potter y la camara secreta,Daniel R.,150

10- Muestre los registros para ver qué se almacenó en "titulo" (cadena cortada).

11- Ingrese el siguiente registro: 
 
10,Elsa y Fred,China Zorrilla,12345

12- Muestre los registros para ver qué se almacenó en "duración" 
(el valor límite permitido por el rango más cercano al ingresado).



No hay comentarios:

Publicar un comentario