Listado completo de tutoriales
14 - Otras características del atributo Identity |
El atributo "identity" permite indicar el valor de inicio de la secuencia y el incremento, para ello usamos la siguiente sintaxis:
create table libros( codigo int identity(100,2), titulo varchar(20), autor varchar(30), precio float );
Los valores comenzarán en "100" y se incrementarán de 2 en 2; es decir, el primer registro ingresado tendrá el valor "100", los siguientes "102", "104", "106", etc.
La función "ident_seed()" retorna el valor de inicio del campo "identity" de la tabla que nombramos:
select ident_seed('libros');
La función "ident_incr()" retorna el valor de incremento del campo "identity" de la tabla nombrada:
select ident_incr('libros');
Hemos visto que en un campo declarado "identity" no puede ingresarse explícitamente un valor.
Para permitir ingresar un valor en un campo de identidad se debe activar la opción "identity_insert":
set identity_insert libros on;
Es decir, podemos ingresar valor en un campo "identity" seteando la opción "identity_insert" en "on".
Cuando "identity_insert" está en ON, las instrucciones "insert" deben explicitar un valor:
insert into libros (codigo,titulo) values (5,'Alicia en el pais de las maravillas');
Si no se coloca un valor para el campo de identidad, la sentencia no se ejecuta y aparece un mensaje de error:
insert into libros (titulo,autor, editorial) values ('Matematica estas ahi','Paenza','Paidos');
El atributo "identity" no implica unicidad, es decir, permite repetición de valores; por ello hay que tener cuidado al explicitar un valor porque se puede ingresar un valor repetido.
Para desactivar la opción "identity_insert" tipeamos:
set identity_insert libros off;
Ingresemos el siguiente lote de comandos en el SQL Server Management Studio:
if object_id('libros') is not null drop table libros; create table libros( codigo int identity(100,2), titulo varchar(20), autor varchar(30), precio float ); go insert into libros (titulo,autor,precio) values('El aleph','Borges',23); insert into libros (titulo,autor,precio) values('Uno','Richard Bach',18); insert into libros (titulo,autor,precio) values('Aprenda PHP','Mario Molina',45.60); select * from libros; -- Para saber cuál es el valor de inicio del campo "identity" de la tabla "libros": select ident_seed('libros'); -- Si intentamos ingresar un valor para el campo "codigo" (genera error): insert into libros (codigo,titulo,autor,precio) values(106,'Martin Fierro','Jose Hernandez',25); -- Para permitir ingresar un valor en un campo de identidad activamos la opción "identity_insert": set identity_insert libros on; -- Recordemos que si "identity_insert" está en ON, la instrucción "insert" DEBE explicitar un valor: insert into libros (codigo,titulo,autor) values (100,'Matematica estas ahi','Paenza'); -- Note que ingresamos un valor de código que ya existe; esto está permitido porque -- el atributo "identity" no implica unicidad. insert into libros (codigo,titulo,autor) values (1,'Ilusiones','Richard Bach'); -- Si no se coloca un valor para el campo de identidad, -- la sentencia no se ejecuta y aparece un mensaje de error: insert into libros (titulo,autor) values ('Uno','Richard Bach'); -- Para desactivar la opción "identity_insert" set identity_insert libros off; -- Intentemos ingresar un valor para el campo "codigo" (genera error): insert into libros (codigo,titulo,autor) values (300,'Uno','Richard Bach');
Tenemos como resultado:
Podemos comentar todos los comandos SQL que generan error y volver a ejecutar: