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

Aktualizuj sekwencję w wierszu INSERT

To znane ograniczenie:sekwencje są zwiększane podczas wywoływania kodu <>nextval() funkcja, która jest twoją domyślną wartością twojego pola. Kiedy dostarczasz dane w INSERT do tego pola, wyrażenie wartości domyślnej nie jest oceniane, dlatego wartość sekwencji nie jest dotykana.

Rozwiązaniem jest ustawienie wyzwalacza przed/po INSERT ręcznie naprawić wartość sekwencji za pomocą setval() . Ale w ten sposób powinieneś trzeba skonfigurować wyzwalacz UPDATE również w tym polu, aby naprawić wartość sekwencji, po prostu aktualizując istniejący identyfikator do wyższego identyfikatora.

Innym obejściem jest napisanie przechowywanej funkcji, która może wygenerować dostępną wartość dla tego pola i ustawić domyślną wartość pola na wartość zwracaną przez tę funkcję. Coś takiego jak:

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

Ale uwaga:domyślna funkcjonalność sekwencji jest bezpieczna dla współbieżnych wstawiania (aktualny stan sekwencji jest globalny - niezależny od transakcji). Jeśli podasz jawne wartości do tych pól, tak nie będzie.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Czy postgresql obsługuje lookbehind regexp?

  2. Jak mogę wybrać sąsiednie wiersze do dowolnego wiersza (w sql lub postgresql)?

  3. Wstawianie zbiorcze SQLAlchemy Core wolno

  4. Uzyskaj zagnieżdżony obiekt w strukturze w gorm

  5. Unikanie wyścigów, Django + Heroku + PostgreSQL