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

Oracle:разлика между max(id)+1 и sequence.nextval

С select max(id) + 1 подход, две сесии, вмъкващи едновременно, ще видят същия текущ максимален идентификатор от таблицата и и двете вмъкват една и съща нова стойност на идентификатора. Единственият начин да използвате това безопасно е да заключите таблицата преди стартиране на транзакцията, което е болезнено и сериализира транзакциите. (И както посочва Stijn, стойностите могат да бъдат използвани повторно, ако най-високият запис бъде изтрит). По принцип никога не използвайте този подход. (Може много понякога да има убедителна причина за това, но не съм сигурен, че някога съм виждал такава).

Последователността гарантира, че двете сесии ще получат различни стойности и не е необходима сериализация. Той ще работи по-добре и ще бъде по-безопасен, по-лесен за кодиране и по-лесен за поддръжка.

Единственият начин да получите дублиращи се грешки с помощта на последователността е ако записи вече съществуват в таблицата с идентификатори над стойността на последователността или ако нещо все още вмъква записи, без да използва последователността. Така че, ако имате съществуваща таблица с ръчно въведени идентификатори, да речем от 1 до 10, и сте създали последователност със стойност по подразбиране за начало със стойност 1, първото вмъкване, използващо последователността, ще се опита да вмъкне идентификатор от 1 - който вече съществува . След като опитате това 10 пъти, последователността ще ви даде 11, което ще работи. Ако след това използвате подхода max-ID, за да направите следващото вмъкване, което ще използва 12, но последователността все още ще бъде на 11 и също така ще ви даде 12 следващия път, когато извикате nextval .

Последователността и таблицата не са свързани. Последователността не се актуализира автоматично, ако в таблицата се вмъкне ръчно генерирана стойност на ID, така че двата подхода не се смесват. (Наред с други неща, същата последователност може да се използва за генериране на идентификатори за множество таблици, както е посочено в документите).

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ORA-04091:таблицата [blah] мутира, тригерът/функцията може да не я види

  2. Създайте тригер, който актуализира колона в една таблица, когато колона в друга таблица се актуализира

  3. Преобразуване на времевата марка към дата в Oracle SQL

  4. SYS_EXTRACT_UTC() Функция в Oracle

  5. 6 начина за изтриване на дублиращи се редове, които имат първичен ключ в Oracle