sql >> Databasteknik >  >> RDS >> PostgreSQL

Autoinkrementera, men utelämna befintliga värden i kolumnen

Uppdatering:Senare, mer detaljerat svar:

Detta bör fungera smidigt:

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;

Slingan hämtar nästa nummer från den givna sekvensen tills en hittas som ännu inte finns i tabellen. Bör till och med vara säkert för samtidig användning , eftersom vi fortfarande litar på en sekvens.

Använd den här funktionen i kolumnstandarden för seriekolumnen (ersätter standardinställningen för seriekolumnerna nextval('t1_id_seq'::regclass) :

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

Handboken om lastval() .

Detta fungerar bra med få öar och många luckor (vilket verkar vara fallet enligt exemplet). Att upprätthålla unikhet, lägg till en unik begränsning (eller primärnyckel) i kolumnen.



  1. Om en tabell finns släpp tabell, skapa den, om den inte finns skapa den bara

  2. Välj kolumnnamn och värde från tabellen

  3. Hur man skapar användare i Oracle och tilldelar privilegier

  4. Entity Framework med mysql, problem med tabeller mellan linux och windows