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

Sqlalchemy и PostgreSql:как да зададете първичен ключ ръчно без конфликти в бъдеще?

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

Ако нямате нищо против ужасната едновременност, можете да LOCK TABLE thetable , върши си работата, setval последователността на идентификатора на таблицата към следващата свободна стойност след това, което сте вмъкнали, и commit за да освободите ключалката. Това обаче все още ще създава проблеми с приложения, които изрично извикват nextval (като много ORM), вместо да позволи на базата данни да дефинира стойността, като я пропусне от ?INSERT списък с колони или изрично именуване като DEFAULT .

В противен случай можете да накарате вашия код (или помощна функция на PL/PgSQL) да направи вмъкването в цикъл за повторен опит, който увеличава ключа и опитва отново, когато получи грешка в целостта. Тази стратегия няма да работи, ако трябва да направите повече от едно вмъкване на транзакция. Освен това в SERIALIZABLE режим на изолация Не мисля, че можете да го направите с PL/PgSQL, трябва да използвате цикъл за повторен опит от страна на клиента, за да се справите с грешките на сериализацията.

Това е ужасна идея. Използвайте последователно ключове, дефинирани от приложението, или последователно дефинирани от базата данни ключове. Не смесвайте двете.




  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 намира всички възможни комбинации (пермутации) в рекурсивна заявка

  2. Как работи Width_Bucket() в PostgreSQL

  3. EF6 + Postgres връзка dbo.AspNetUsers не съществува

  4. Таблица Печат не отговаря на размера на страницата

  5. Преобразувайте клеймото за време в местно време за дадена часова зона по време на „КОПИРАЙТЕ .. КЪМ ..“