13 - Campo con atributo Identity


Problema:

Trabajamos con la tabla "libros" de una librería.
Eliminamos la tabla "libros", si existe:

 if object_id('libros') is not null
  drop table libros;

Creamos la tabla especificando que el campos "codigo" genere valores secuenciales comenzando en 1 e incrementándose en 1 automáticamente:

 create table libros(
  codigo int identity,
  titulo varchar(40) not null,
  autor varchar(30),
  editorial varchar(15),
  precio float
 );

Ingresamos algunos registros, recordando que si un campo tiene el atributo "identity" debemos omitirlo en la inserción:

 insert into libros (titulo,autor,editorial,precio)
  values('El aleph','Borges','Emece',23);

Veamos cómo se almacenó:

 select * from libros;

Este primer registro ingresado guarda el valor 1 en el campo correspondiente al código.

Continuemos ingresando registros:

 insert into libros (titulo,autor,editorial,precio)
  values('Uno','Richard Bach','Planeta',18);
 insert into libros (titulo,autor,editorial,precio)
  values('Aprenda PHP','Mario Molina','Siglo XXI',45.60);
 insert into libros (titulo,autor,editorial,precio)
  values('Alicia en el pais de maravillas','Lewis Carroll','Paidos',15.50);

Veamos cómo se almacenaron:

 select * from libros;

el código (dato que no ingresamos) se cargó automáticamente siguiendo la secuencia de autoincremento.

Intentemos ingresar un valor para el campo "codigo":

 insert into libros (codigo,titulo,autor,editorial,precio)
  values(5,'Martin Fierro','Jose Hernandez','Paidos',25);

generará un mensaje de error.

Un campo "identity" tampoco puede ser actualizado. Intentemos cambiar el valor de código de un registro:

 update libros set codigo=9
  where titulo='Uno';

aparece un mensaje de error.

Vamos a ver la estructura de la tabla ejecutando el siguiente procedimiento almacenado:

 exec sp_columns libros;

Note que en el campo "codigo", en la columna "TYPE_NAME" aparece "int identity" y en la columna IS_NULLABLE" aparece "NO", porque un campo "identity" automáticamente se convierte en "not null". En el campo "titulo", en la columna "IS_NULLABLE" aparece "NO" porque explícitamente indicamos que el campo fuera "not null".

Eliminemos el último registro:

 delete from libros
  where autor='Lewis Carroll';

Ingresamos un quinto registro y luego vemos que en el campo código se guardó el valor secuencial sin considerar que el valor "4" ya no existe:

  insert into libros (titulo, autor, editorial, precio)
  values('Martin Fierro','Jose Hernandez','Paidos',25); 
  select * from libros;



Retornar