sábado, 7 de abril de 2012

12 - Campo entero con autoincremento.

Un campo de tipo entero puede tener otro atributo extra 'auto_increment'. Los valores de un campo 'auto_increment', se inician en 1 y se incrementan en 1 automáticamente.

Se utiliza generalmente en campos correspondientes a códigos de identificación para generar valores únicos para cada nuevo registro que se inserta.

Sólo puede haber un campo "auto_increment" y debe ser clave primaria (o estar indexado).

Para establecer que un campo autoincremente sus valores automáticamente, éste debe ser entero (integer) y debe ser clave primaria:

create table libros(
  codigo int auto_increment,
  titulo varchar(20),
  autor varchar(30),
  editorial varchar(15),
  primary key (codigo)
 );
 
Para definir un campo autoincrementable colocamos "auto_increment" luego de la definición del campo al crear la tabla.

Hasta ahora, al ingresar registros, colocamos el nombre de todos los campos antes de los valores; es posible ingresar valores para algunos de los campos de la tabla, pero recuerde que al ingresar los valores debemos tener en cuenta los campos que detallamos y el orden en que lo hacemos.

Cuando un campo tiene el atributo "auto_increment" no es necesario ingresar valor para él, porque se inserta automáticamente tomando el último valor como referencia, o 1 si es el primero.

Para ingresar registros omitimos el campo definido como "auto_increment", por ejemplo:

insert into libros (titulo,autor,editorial)
 values('El aleph','Borges','Planeta');
 
Este primer registro ingresado guardará el valor 1 en el campo correspondiente al código. 

Si continuamos ingresando registros, el código (dato que no ingresamos) se cargará automáticamente siguiendo la secuencia de autoincremento.

Un campo "auto_increment" funciona correctamente sólo cuando contiene únicamente valores positivos. Más adelante explicaremos cómo definir un campo con sólo valores positivos.

Está permitido ingresar el valor correspondiente al campo "auto_increment", por ejemplo:

insert into libros (codigo,titulo,autor,editorial)
 values(6,'Martin Fierro','Jose Hernandez','Paidos');
 
Pero debemos tener cuidado con la inserción de un dato en campos "auto_increment". Debemos tener en cuenta que:

- si el valor está repetido aparecerá un mensaje de error y el 
registro no se ingresará.
- si el valor dado saltea la secuencia, lo toma igualmente y en 
las siguientes inserciones, continuará la secuencia tomando el valor 
más alto.
- si el valor ingresado es 0, no lo toma y guarda el registro 
continuando la secuencia.
- si el valor ingresado es negativo (y el campo no está definido
para aceptar sólo valores positivos), lo ingresa.
 
Para que este atributo funcione correctamente, el campo debe contener solamente valores positivos; más adelante trataremos este tema.


Problema Resuelto: 

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

Eliminamos la tabla, si existe:

drop table if exists libros;
 
Creamos la tabla estableciendo como clave primaria y "auto_increment" el campo "codigo":

create table libros(
  codigo integer auto_increment,
  titulo varchar(20),
  autor varchar(30),
  editorial varchar(15),
  primary key (codigo)
 );
 
Al visualizar la estructura de la tabla:

describe libros;
 
vemos que en la columna "EXTRA" del campo "codigo" aparece "auto_increment", esto significa que el campo es autoincrementable, en la columna "KEY" aparece "PRI", es clave primaria.

Ingresamos algunos registros:

insert into libros (titulo,autor,editorial)
 values('El aleph','Borges','Planeta');
 
Note que al detallar los campos para los cuales ingresaremos valores hemos omitido "codigo"; cuando un campo es "auto_increment" no es necesario ingresar valor para él, porque se genera automáticamente. Recuerde que si es obligatorio ingresar los datos de todos los campos que se detallan y en el mismo orden.
Si mostramos los registros:


select * from libros;
 
vemos que este primer registro ingresado guardó el valor 1 en el campo correspondiente al código, comenzó la secuencia en 1.

Ingresamos más registros:

insert into libros (titulo,autor,editorial)
  values('Martin Fierro','Jose Hernandez','Emece');
 insert into libros (titulo,autor,editorial)
  values('Aprenda PHP','Mario Molina','Emece');
 insert into libros (titulo,autor,editorial)
  values('Cervantes y el quijote','Borges','Paidos');
 insert into libros (titulo,autor,editorial)
  values('Matematica estas ahi', 'Paenza', 'Paidos');
 
Seleccionamos todos los registros:

select codigo,titulo,autor,editorial from libros;
 
Vemos que el código, dato que no ingresamos, se cargó automáticamente siguiendo la secuencia de autoincremento.

Está permitido ingresar el valor correspondiente al campo "auto_increment", por ejemplo:

insert into libros (codigo,titulo,autor,editorial)
 values(6,'Martin Fierro','Jose Hernandez','Paidos');
 
Pero debemos tener cuidado con la inserción de un dato en campos "auto_increment".
Veamos los distintos casos.

Si ingresamos un valor repetido, aparecerá un mensaje de error y el registro no se ingresará:

insert into libros (codigo,titulo,autor,editorial)
 values(2,'Martin Fierro','Jose Hernandez','Planeta');
 
Si ingresamos un valor que no sigue la secuencia, el dato es válido, lo toma, por ejemplo:

insert into libros (codigo,titulo,autor,editorial)
 values(15,'Harry Potter y la piedra filosofal','J.K. Rowling','Emece');
 
El siguiente registro insertado tomará el valor más alto para seguir la secuencia (en este caso 16):

insert into libros (titulo,autor,editorial)
 values('Harry Potter y la camara secreta','J.K. Rowling','Emece');
 
Si ingresamos 0, no lo toma y guarda el registro continuando la secuencia (17 en este caso):

insert into libros (codigo,titulo,autor,editorial)
 values(0,'Alicia en el pais de las maravillas','Lewis Carroll','Planeta');
 
Si ingresamos un valor negativo (y el campo no está definido para aceptar sólo valores positivos), lo ingresa:

insert into libros (codigo,titulo,autor,editorial)
 values(-5,'Alicia a traves del espejo','Lewis Carroll','Planeta');
 
 
Problema Propuesto:
 
Una farmacia guarda información referente a sus medicamentos en una tabla 
llamada "medicamentos".

1- Elimine la tabla,si existe:
 

2- Cree la tabla con la siguiente estructura: 
 
create table medicamentos(
  codigo integer auto_increment,
  nombre varchar(20),
  laboratorio varchar(20),
  precio float,
  cantidad integer,
  primary key (codigo)
);

3- Visualice la estructura de la tabla "medicamentos".

4- Ingrese los siguientes registros:
 (nombre, laboratorio,precio,cantidad)
  Sertal,Roche,5.2,100
  Buscapina,Roche,4.10,200
  Amoxidal 500,Bayer,15.60,100

5- Verifique que el campo "código" generó los valores de modo automático:
 
6- Intente ingresar un registro con un valor de clave primaria repetido.

7- Ingrese un registro con un valor de clave primaria no repetido salteando la secuencia:
 
8- Ingrese el siguiente registro:
 
Note que sigue la secuencia.
 
 
Otros problemas: 
Un videoclub almacena información sobre sus películas en una tabla llamada 
"peliculas".

1- Elimine la tabla si existe.

2- Créela con la siguiente estructura:
 -codigo (entero), autoincremento,
 -titulo (cadena de 30),
 -actor (cadena de 20),
 -duracion (entero),
 -clave primaria: codigo.

3- Visualice la estructura de la tabla "peliculas".

4- Ingrese los siguientes registros:
  (titulo,actor,duracion)
  Mision imposible,Tom Cruise,120
  Harry Potter y la piedra filosofal,xxx,180
  Harry Potter y la camara secreta,xxx,190
  Mision imposible 2,Tom Cruise,120
  La vida es bella,zzz,220
 
 5- Seleccione todos los registros y verifique la carga automática de los códigos.

6- Actualice las películas cuyo código es 3 colocando en "actor" 'Daniel R.'

7- Elimine la película 'La vida es bella'.

8- Elimine todas las películas cuya duración sea igual a 120 minutos.

9- Visualice los registros.

10- Ingrese el siguiente registro, sin valor para la clave primaria:
 
  Mujer bonita,Richard Gere,120
 
Note que sigue la secuencia tomando el último valor generado, aunque ya no esté.

11- Ingrese el siguiente registro, con valor para la clave primaria:
 
  1,Tootsie,D. Hoffman,90
 
Lo acepta porque la clave no está repetida.

12- Intente ingresar un registro con valor de clave repetida.

13- Ingrese el siguiente registro, sin valor para la clave primaria:
 
  Un oso rojo,Julio Chavez,100 
 
Note que sigue la secuencia.
 
 
   

No hay comentarios:

Publicar un comentario