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

Sqlalchemy i PostgreSql:jak ręcznie ustawić klucz podstawowy bez konfliktów w przyszłości?

Nie znam żadnego bezpiecznego, skutecznego sposobu robienia tego, czego chcesz. Naprawdę powinieneś wybrać, czy chcesz zdefiniować klucze samodzielnie, czy użyć wygenerowanych kluczy i trzymać się jednej lub drugiej strategii.

Jeśli nie masz nic przeciwko okropnej współbieżności, możesz LOCK TABLE thetable , rób swoją pracę, setval sekwencja identyfikatora tabeli do następnej wolnej wartości po wstawieniu i commit aby zwolnić blokadę. Jednak nadal będzie to powodować problemy z aplikacjami, które jawnie wywołują nextval (jak wiele ORM-ów) zamiast pozwolić bazie danych zdefiniować wartość przez pominięcie jej w ?INSERT lista kolumn lub jawne nazwanie jej jako DEFAULT .

W przeciwnym razie możesz mieć swój kod (lub funkcję pomocniczą PL/PgSQL) wstawić w pętli ponawiania, która zwiększa klucz i próbuje ponownie, gdy wystąpi błąd integralności. Ta strategia nie zadziała, jeśli potrzebujesz zrobić więcej niż tylko jedną wstawkę na transakcję. Ponadto w SERIALIZABLE tryb izolacji Nie sądzę, że możesz to zrobić z PL/PgSQL, musisz użyć pętli ponawiania po stronie klienta, aby obsłużyć błędy serializacji.

To okropny pomysł. Konsekwentnie używaj kluczy zdefiniowanych przez aplikację lub kluczy zdefiniowanych w bazie danych. Nie mieszaj tych dwóch.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dlaczego funkcje PL/pgSQL mogą mieć efekt uboczny, a funkcje SQL nie?

  2. Aktualizacja Postgres z lewego przyłączenia

  3. Wywoływanie RESTful Web Services z procedury/funkcji PostgreSQL

  4. Ciąg połączenia PostgreSQL ze sterownikiem ODBC w C#, nieobsługiwane słowo kluczowe:sterownik

  5. Ustaw domyślną wartość zwracaną dla funkcji Postgres