Listado completo de tutoriales
13 - Campo entero serial (autoincremento) |
Los valores de un campo serial, 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.
Normalmente se define luego este campo como clave primaria.
Para establecer que un campo autoincremente sus valores automáticamente, éste debe ser de tipo serial:
create table libros( codigo serial, titulo varchar(20), autor varchar(30), editorial varchar(15), primary key (codigo) );
Para definir un campo autoincrementable lo hacemos con la palabra clave serial.
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 es de tipo serial 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 serial, 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.
Más adelante cuando veamos el concepto de secuencias veremos que los campos serial son el realidad un campo int que tienen asociado una "secuencia".
Un campo serial podemos indicar el valor en el insert, pero en la siguiente inserción que hagamos la secuencia continúa en el último valor generado automáticamente. Puede tener sentido utilizar esta característica para reutilizar un código de un campo borrado, por ejemplo si en la tabla libros borramos el libro con el código 1, luego podemos insertar otro libro con dicho código:
delete from libros where codigo=1; insert into libros (codigo,titulo,autor,editorial) values(1,'Aprender Python', 'Rodriguez Luis', 'Paidos');
drop table if exists libros; create table libros( codigo serial, titulo varchar(30), autor varchar(30), editorial varchar(15), primary key (codigo) ); -- Al visualizar la estructura de la tabla: select table_name,column_name,udt_name,character_maximum_length,is_nullable from information_schema.columns where table_name = 'libros'; -- 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 serial 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. -- Ahora borramos el libro con código 1: delete from libros where codigo=1; -- Mostramos todos los registros: select * from libros; -- Insertamos un nuevo libro e indicamos el valor que debe tomar el campo serial: insert into libros (codigo,titulo,autor,editorial) values(1,'Aprender Python', 'Rodriguez Luis', 'Paidos'); select * from libros; -- Luego si insertamos otro registro sin indicar el valor del campo serial el valor -- generado es el siguiente del último generado: insert into libros (titulo,autor,editorial) values('Java Ya', 'Nelson', 'Paidos'); select * from libros;
La ejecución de parte de este lote de comandos SQL genera una salida similar a: