PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Autoinkrementacja, ale pomiń istniejące wartości w kolumnie

Aktualizacja:później, bardziej szczegółowa odpowiedź:

To powinno działać bezproblemowo:

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;

Pętla pobiera następną liczbę z podanej sekwencji, dopóki nie zostanie znaleziona taka, której nie ma jeszcze w tabeli. Powinien być nawet bezpieczny do równoczesnego użytku , ponieważ nadal polegamy na sekwencji.

Użyj tej funkcji w domyślnej kolumnie kolumny szeregowej (zastępując wartość domyślną dla kolumn szeregowych nextval('t1_id_seq'::regclass) :

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

Podręcznik dotyczący lastval() .

Działa to dobrze z kilkoma wyspami i wieloma lukami (co wydaje się, że tak jest na przykładzie). Aby wymusić unikatowość, dodaj unikalne ograniczenie (lub klucz główny) w kolumnie.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kontener Spring Docker nie może uzyskać dostępu do kontenera Postgres Docker

  2. W jaki sposób funkcja przechowywana Postgres może zwrócić tabelę?

  3. Jak wyjść z narzędzia wiersza poleceń PostgreSQLs (psql)

  4. Utwórz listę wszystkich dni w miesiącu i podziel wartość równo na każdy dzień

  5. Rails:Dodanie migracji w celu dodania tablicy (domyślnie puste)