Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Oracle:różnica między max(id)+1 a sekwencją.nextval

Za pomocą select max(id) + 1 podejście, dwie sesje wstawiające jednocześnie zobaczą ten sam bieżący maksymalny identyfikator z tabeli i obie wstawią tę samą nową wartość identyfikatora. Jedynym sposobem bezpiecznego użycia tego jest zablokowanie tabeli przed rozpoczęciem transakcji, co jest bolesne i powoduje serializację transakcji. (I jak wskazuje Stijn, wartości można ponownie wykorzystać, jeśli najwyższy rekord zostanie usunięty). Zasadniczo nigdy nie stosuj tego podejścia. (Od czasu do czasu może być ku temu ważny powód, ale nie jestem pewien, czy kiedykolwiek go widziałem).

Sekwencja gwarantuje, że dwie sesje otrzymają różne wartości i nie jest potrzebna serializacja. Będzie działać lepiej i będzie bezpieczniejszy, łatwiejszy do kodowania i łatwiejszy w utrzymaniu.

Jedynym sposobem uzyskania zduplikowanych błędów przy użyciu sekwencji jest to, że rekordy już istnieją w tabeli z identyfikatorami powyżej wartości sekwencji lub jeśli coś nadal wstawia rekordy bez użycia sekwencji. Więc jeśli masz istniejącą tabelę z ręcznie wprowadzonymi identyfikatorami, powiedzmy od 1 do 10, i utworzyłeś sekwencję z domyślną wartością start-z wartością 1, pierwsza wstawka używająca sekwencji spróbuje wstawić identyfikator 1 - który już istnieje . Po próbie 10 razy sekwencja dałaby 11, co by zadziałało. Jeśli następnie użyjesz podejścia max-ID do wykonania następnego wstawienia, które użyje 12, ale sekwencja nadal będzie na 11 i da ci również 12 następnym razem, gdy wywołasz nextval .

Sekwencja i tabela nie są ze sobą powiązane. Sekwencja nie jest automatycznie aktualizowana, jeśli ręcznie wygenerowana wartość identyfikatora zostanie wstawiona do tabeli, więc te dwa podejścia nie mieszają się. (Pomiędzy innymi ta sama sekwencja może być użyta do wygenerowania identyfikatorów dla wielu tabel, jak wspomniano w dokumentacji).

Jeśli zmieniasz podejście ręczne na podejście sekwencyjne, musisz upewnić się, że sekwencja jest tworzona z wartością początkową, która jest wyższa niż wszystkie istniejące identyfikatory w tabeli, oraz że wszystko, co wykonuje wstawianie, używa sekwencji tylko w przyszłości.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dynamiczna partycja tabeli Oracle

  2. Zbierz statystyki schematu za pomocą FND_STATS w EBS 11i i R12

  3. Powtarzające się wiersze na podstawie wartości kolumny w każdym wierszu

  4. INSTR() Funkcja w Oracle

  5. JDBC ResultSet otrzymuje kolumny z aliasem tabeli