PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Incrementar automaticamente, mas omitir valores existentes na coluna


Atualização:Mais tarde, resposta mais detalhada:

Isso deve funcionar sem problemas:
CREATE OR REPLACE FUNCTION f_next_free(_seq regclass)
  RETURNS integer AS
$func$
BEGIN
   LOOP
      PERFORM nextval(_seq);
      EXIT WHEN NOT EXISTS (SELECT 1 FROM db.t1 WHERE id = lastval());
   END LOOP; 

   RETURN lastval();
END
$func$  LANGUAGE plpgsql VOLATILE;

O loop está buscando o próximo número da sequência fornecida até que seja encontrado um que ainda não esteja na tabela. Deve ser seguro para uso simultâneo , já que ainda dependemos de uma sequência.

Use esta função na coluna padrão da coluna serial (substituindo o padrão para as colunas seriais nextval('t1_id_seq'::regclass) :
ALTER TABLE db.t1 ALTER COLUMN id
SET DEFAULT f_next_free('t1_id_seq'::regclass);

O manual sobre lastval() .

Isso funciona bem com poucas ilhas e muitas lacunas (o que parece ser o caso de acordo com o exemplo). Para aplicar exclusividade, adicione uma restrição exclusiva (ou chave primária) na coluna.