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

Актуализирайте последователността на ред INSERT

Това е известно ограничение:последователностите се увеличават по време на извикването на nextval() функция, която е вашата стойност по подразбиране на вашето поле. Когато предоставяте данни на INSERT към това поле, изразът на стойността по подразбиране не се оценява, затова стойността на последователността не се докосва.

Заобиколно решение е да настроите тригер преди/след INSERT за ръчно коригиране на стойността на последователността с setval() . Но по този начин трябва трябва да настроите тригер на UPDATE в това поле също, за да коригирате стойността на последователността, когато просто актуализирате някои съществуващи id до по-висок id.

Друго заобиколно решение е да напишете съхранена функция, която може да произведе налична стойност за това поле и да зададе стойността по подразбиране на вашето поле на върнатата стойност на тази функция. Нещо като:

LOOP
    result = nextval('my_id_seq');
    EXIT WHEN NOT EXISTS (SELECT * FROM my_table WHERE my_id = result);
END LOOP;
RETURN result;

Но бъдете предупредени:функционалността по подразбиране за последователности е безопасна за едновременни вмъквания (текущото състояние на последователността е глобално - независимо от транзакцията). Ако предоставите изрични стойности на тези полета, това няма да е така.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как моето приложение Ruby on Rails има достъп до базата данни без паролата?

  2. Как да получите броя на INNER присъединяването и броя на броя на всички елементи?

  3. SQL:Как да обединим дубликати, които не са чувствителни към главни и малки букви

  4. [Laravel]:SQLSTATE[3F000]:Невалидно име на схема

  5. Отворени са ранни регистрации за PGDay.IT 2011