Listado completo de tutoriales

70 - Secuencias (create sequence- alter sequence - nextval - drop sequence)


Una secuencia (sequence) se emplea para generar valores enteros secuenciales únicos y asignárselos a campos numéricos; se utilizan generalmente para las claves primarias de las tablas garantizando que sus valores no se repitan (normalmente utilizamos la definición de un campo serial, este tiene asociado una secuencia en forma automática)

Una secuencia es una tabla con un campo numérico en el cual se almacena un valor y cada vez que se consulta, se incrementa tal valor para la próxima consulta.

Sintaxis general:

 create sequence NOMBRESECUENCIA
  start with VALORENTERO
  increment by VALORENTERO
  maxvalue VALORENTERO
  minvalue VALORENTERO
  cycle;

- La cláusula "start with" indica el valor desde el cual comenzará la generación de números secuenciales. Si no se especifica, se inicia con el valor que indique "minvalue".

- La cláusula "increment by" especifica el incremento, es decir, la diferencia entre los números de la secuencia; debe ser un valor numérico entero positivo o negativo diferente de 0. Si no se indica, por defecto es 1.

- "maxvalue" define el valor máximo para la secuencia. Si se omite, por defecto es 9223372036854775807.

- "minvalue" establece el valor mínimo de la secuencia. Si se omite será -9223372036854775808.

- La cláusula "cycle" indica que, cuando la secuencia llegue a máximo valor (valor de "maxvalue") se reinicie, comenzando con el mínimo valor ("minvalue") nuevamente, es decir, la secuencia vuelve a utilizar los números. Si se omite, por defecto la secuencia se crea "nocycle", lo que produce un error si supera el máximo valor.

Si no se especifica ninguna cláusula, excepto el nombre de la secuencia, por defecto, comenzará en 1, se incrementará en 1, el mínimo valor será -9223372036854775808, el máximo será 9223372036854775807 y "nocycle".

En el siguiente ejemplo creamos una secuencia llamada "sec_codigolibros", estableciendo que comience en 1, sus valores estén entre 1 y 99999 y se incrementen en 1, por defecto, será "nocycle":

 create sequence sec_codigolibros
  start with 1
  increment by 1
  maxvalue 99999
  minvalue 1;

Si bien, las secuencias son independientes de las tablas, se utilizarán generalmente para una tabla específica, por lo tanto, es conveniente darle un nombre que referencie a la misma.

Otro ejemplo:

 create sequence sec_numerosocios
  start with 2
  increment by 5
  cycle;

La secuencia anterior, "sec_numerosocios", incrementa sus valores en 5 y al llegar al máximo valor recomenzará la secuencia desde el valor mínimo.

Dijimos que las secuencias son tablas; por lo tanto se accede a ellas mediante consultas, empleando "select".

select * from sec_numerosocios;

Tenemos una función que nos retorna el próximo valor de la secuencia:

select nextval('sec_numerosocios');
select nextval('sec_numerosocios');

Imprime un 2 y un 3.

El valor retornado "nextval" pueden usarse cuando definimos una tabla.

Veamos un ejemplo completo:

Creamos una secuencia para el código de la tabla "libros", especificando el valor máximo, el incremento y que no sea circular:

 create sequence sec_codigolibros
  minvalue 1000
  maxvalue 999999
  increment by 1;

Creamos la tabla libros y asociamos a la columna codigo la secuenca sec_codigolibros:

 create table libros(
  codigo nextval('sec_codigolibros'),
  titulo varchar(30),
  autor varchar(30),
  editorial varchar(15),
  primary key (codigo)
 );

Ingresamos un registro en "libros":

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

Ingresamos otro registro en "libros":

 insert into libros(titulo,autor,editorial) values
  ('Matematica estas ahi', 'Paenza','Nuevo siglo');

Luego si imprimimos los dos registros podemos comprobar que el campo codigo almacena el valor 1000 y 1001 respectivamente.

Para eliminar una secuencia empleamos "drop sequence". Sintaxis:

 drop sequence NOMBRESECUENCIA;

Si la secuencia depende de otro objeto (en este caso una tabla) no se procede al borrado), debemos primero borrar la tabla y luego la secuencia, o utilizar (borra los objetos asociados a la secuencia):

 drop sequence NOMBRESECUENCIA cascade;

Si la secuencia no existe aparecerá un mensaje indicando tal situación.

Podemos modificar una secuencia con la siguiente sintaxis:

 alter sequence NOMBRESECUENCIA
  start with VALORENTERO
  increment by VALORENTERO
  maxvalue VALORENTERO
  minvalue VALORENTERO
  cycle;

Ingresemos el siguiente lote de comandos SQL en pgAdmin:

drop table if exists libros;
drop sequence if exists sec_codigolibros;

 create sequence sec_codigolibros
  minvalue 1000
  maxvalue 999999
  increment by 1;

 -- Creamos la tabla libros y asociamos el valor por defecto
 -- para el campo codigo el valor de la secuencia:
 create table libros(
  codigo bigint default nextval('sec_codigolibros'),
  titulo varchar(30),
  autor varchar(30),
  editorial varchar(15),
  primary key (codigo)
 );

 insert into libros(titulo,autor,editorial) values
  ('El aleph', 'Borges','Emece');
 insert into libros(titulo,autor,editorial) values
  ('Matematica estas ahi', 'Paenza','Nuevo siglo');

select * from libros;

La ejecución de este lote de comandos SQL genera una salida similar a:

PostgreSQL pgAdmin create sequence


Retornar