PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Incremento automatico, ma ometti i valori esistenti nella colonna

Aggiornamento:risposta successiva, più dettagliata:

Questo dovrebbe funzionare senza problemi:

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;

Il ciclo sta recuperando il numero successivo dalla sequenza data fino a quando non ne viene trovato uno che non è ancora nella tabella. Dovrebbe anche essere sicura per l'uso simultaneo , poiché ci affidiamo ancora a una sequenza.

Utilizzare questa funzione nella colonna predefinita della colonna seriale (sostituendo il valore predefinito per le colonne seriali nextval('t1_id_seq'::regclass) :

ALTER TABLE db.t1 ALTER COLUMN id
SET DEFAULT f_next_free('t1_id_seq'::regclass);

Il manuale su lastval() .

Questo funziona bene con poche isole e molte lacune (come sembra essere il caso secondo l'esempio). Per applicare unicità, aggiungi un vincolo univoco (o chiave primaria) sulla colonna.