sql >> Database >  >> RDS >> PostgreSQL

Automatisch verhogen, maar bestaande waarden in de kolom weglaten

Update:Later, meer gedetailleerd antwoord:

Dit zou soepel moeten werken:

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;

De lus haalt het volgende nummer uit de gegeven reeks op totdat er een wordt gevonden die nog niet in de tabel staat. Zou zelfs veilig moeten zijn voor gelijktijdig gebruik , omdat we nog steeds op een reeks vertrouwen.

Gebruik deze functie in de kolom standaard van de seriële kolom (ter vervanging van de standaard voor de seriële kolommen nextval('t1_id_seq'::regclass) :

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

De handleiding over lastval() .

Dit presteert goed met weinig eilanden en veel hiaten (wat volgens het voorbeeld het geval lijkt te zijn). Om af te dwingen uniciteit, voeg een unieke beperking (of primaire sleutel) in de kolom.



  1. Hoe kan ik een MySQL-zoekopdracht schrijven die verkeerd gespelde gegevens kan compenseren?

  2. Laravel 5.4 upgrade, converteren naar utf4mb van utf8

  3. MySQL JOIN - Retourneer NULL voor dubbele resultaten in de linkertabel

  4. Deadlock bij het maken van taakinstanties