PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Autoincrement, aber vorhandene Werte in der Spalte weglassen

Update:Später, ausführlichere Antwort:

Das sollte reibungslos funktionieren:

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;

Die Schleife holt die nächste Zahl aus der gegebenen Sequenz, bis eine gefunden wird, die noch nicht in der Tabelle ist. Sollte sogar sicher für die gleichzeitige Verwendung sein , da wir immer noch auf eine Sequenz angewiesen sind.

Verwenden Sie diese Funktion im Spaltenstandard der seriellen Spalte (ersetzen Sie den Standardwert für die seriellen Spalten nextval('t1_id_seq'::regclass) :

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

Das Handbuch zu lastval() .

Dies funktioniert gut mit wenigen Inseln und vielen Lücken (was gemäß dem Beispiel der Fall zu sein scheint). durchzusetzen Eindeutigkeit, fügen Sie eine Eindeutigkeitsbeschränkung (oder Primärschlüssel) in der Spalte.