PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Автоматично увеличаване, но пропуснете съществуващите стойности в колоната

Актуализация:По-късно, по-подробен отговор:

Това трябва да работи гладко:

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;

Цикълът извлича следващото число от дадената последователност, докато се намери такова, което все още не е в таблицата. Дори би трябвало да е безопасно за едновременна употреба , тъй като все още разчитаме на последователност.

Използвайте тази функция в колоната по подразбиране на серийната колона (заменяйки по подразбиране за серийните колони nextval('t1_id_seq'::regclass) :

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

Ръководството за lastval() .

Това се представя добре с малко острови и много пропуски (което изглежда е така според примера). За налагане уникалност, добавете уникално ограничение (или първичен ключ) в колоната.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL планета в Ansible Galaxy

  2. ГРЕШКА на Geoserver:функция postgis_lib_version()

  3. Как да добавите текущ брой към редове в „поредица“ от последователни дни

  4. Как мога да посоча MIME типа на heroku?

  5. Върнете PostgreSQL UUID масив като списък с psycopg2