Dzięki podejściu select max(id) + 1
, dwie sesje wstawiania jednocześnie będą se Ten sam bieżący maksymalny identyfikator z tabeli i oba wstawiają tę samą nową wartość identyfikatora. Jedynym sposobem bezpiecznego użycia jest zablokowanie stołu przed rozpoczęciem transakcji, co jest bolesne i serializuje transakcje. (I jak wskazuje Stijn, wartości można wykorzystać ponownie, jeśli najwyższy rekord zostanie usunięty). Zasadniczo nigdy nie stosuj tego podejścia. (Czasami może to być nieodparty powód, aby to zrobić, ale nie jestem pewien, czy kiedykolwiek widziałem).
Numer sequence guarantees that the two sessions will get different values, bez konieczności serializacji. Będzie działał lepiej i będzie bezpieczniejszy, łatwiejszy do kodowania i łatwiejszy w utrzymaniu.
Jedynym sposobem na uzyskanie powtarzających się błędów przy użyciu sekwencji jest zapisanie rekordów już w tabeli z identyfikatorami powyżej wartości sekwencji lub jeśli coś nadal wstawia rekordy bez użycia sekwencji. Jeśli więc masz istniejącą tabelę z ręcznie wprowadzonymi identyfikatorami, powiedz 1 do 10 i utworzyłeś sekwencję z domyślnym początkiem - z wartością 1, pierwsza wstawka używająca sekwencji spróbuje wstawić identyfikator 1 - który już istnieje . Po wypróbowaniu tego 10 razy sekwencja dałaby 11, które działałyby. Jeśli następnie używałeś podejścia max-ID do wykonania następnego wkładu, który użyłby 12, ale sekwencja nadal byłaby na 11, a także dałaby ci 12 następnym razem, gdy zadzwoniłbyś pod numer nextval
.
Sekwencja i tabela nie są powiązane. Sekwencja nie jest automatycznie aktualizowana, jeśli ręcznie wstawiona wartość identyfikatora zostanie wstawiona do tabeli, więc te dwa podejścia nie mieszają się. (Między innymi, ta sama sekwencja może być używana do generowania identyfikatorów dla wielu tabel, jak wspomniano w dokumentach).
Jeśli zmieniasz podejście ręczne na podejście sekwencyjne, musisz upewnić się, że sekwencja jest tworzona z wartością początkową wyższą niż wszystkie istniejące identyfikatory w tabeli i że wszystko, co robi insert używa sekwencji tylko w przyszłości.
ale trochę czasu Dlaczego otrzymuję błąd duplikat rekordu z sequence.nextval i działa kiedy uruchamiam to samo zapytanie z max (id) +1 –
@PriyaPrajapati - ponieważ aktualna wartość twojej sekwencji jest niższa niż maksymalny identyfikator w tabeli. Sekwencja nie zostanie zmodyfikowana, jeśli ręcznie wstawisz wartość do tabeli. Nie powinieneś mieszać dwóch podejść - uzyskaj kolejność, aby była wyższa niż wartości w tabeli, a następnie używaj tylko sekwencji. –
@Alex - Dzięki za odpowiedź, to może być powód błędu –