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

Autoincrement, men udelad eksisterende værdier i kolonnen

Opdatering:Senere, mere detaljeret svar:

Dette burde fungere problemfrit:

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;

Løkken henter det næste tal fra den givne sekvens, indtil der findes et, som endnu ikke er i tabellen. Bør endda være sikker til samtidig brug , da vi stadig er afhængige af en sekvens.

Brug denne funktion i kolonnestandarden for den serielle kolonne (erstatter standarden for de serielle kolonner nextval('t1_id_seq'::regclass) :

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

Håndbogen om lastval() .

Dette fungerer godt med få øer og mange huller (hvilket ser ud til at være tilfældet ifølge eksemplet). At håndhæve unikhed, tilføj en unik begrænsning (eller primær nøgle) på kolonnen.



  1. PHP PDO SQL returnerer kun én række data i stedet for alle rækker

  2. Alligevel at oprette en SQL Server DDL-udløser for SELECT-sætninger?

  3. Android SQLite:Hvordan genererer man en stor tabel til testformål?

  4. Magento:Kan ikke logge på admin