Oracle
 sql >> Database >  >> RDS >> Oracle

Oracle:differenza tra max(id)+1 e sequence.nextval

Con il select max(id) + 1 approccio, due sessioni che si inseriscono contemporaneamente vedranno lo stesso ID massimo corrente dalla tabella ed entrambe inseriranno lo stesso nuovo valore ID. L'unico modo per utilizzarlo in modo sicuro è bloccare la tabella prima di avviare la transazione, il che è doloroso e serializza le transazioni. (E come sottolinea Stijn, i valori possono essere riutilizzati se viene eliminato il record più alto). Fondamentalmente, non usare mai questo approccio. (Potrebbe esserci molto occasionalmente un motivo convincente per farlo, ma non sono sicuro di averne mai visto uno).

La sequenza garantisce che le due sessioni riceveranno valori diversi e non è necessaria la serializzazione. Funzionerà meglio e sarà più sicuro, più facile da codificare e più facile da mantenere.

L'unico modo per ottenere errori duplicati utilizzando la sequenza è se nella tabella esistono già record con ID superiori al valore della sequenza o se qualcosa sta ancora inserendo record senza utilizzare la sequenza. Quindi, se avevi una tabella esistente con ID inseriti manualmente, diciamo da 1 a 10, e hai creato una sequenza con un valore predefinito che inizia con 1, il primo inserimento che utilizza la sequenza proverebbe a inserire un ID di 1 - che già esiste . Dopo aver provato 10 volte la sequenza ti darebbe 11, il che funzionerebbe. Se quindi utilizzassi l'approccio max-ID per eseguire l'inserimento successivo, ciò userebbe 12, ma la sequenza sarebbe ancora su 11 e ti darebbe anche 12 la prossima volta che chiamerai nextval .

La sequenza e la tabella non sono correlate. La sequenza non viene aggiornata automaticamente se nella tabella viene inserito un valore ID generato manualmente, quindi i due approcci non si mescolano. (Tra le altre cose, la stessa sequenza può essere utilizzata per generare ID per più tabelle, come indicato nei documenti).

Se stai passando da un approccio manuale a un approccio di sequenza, devi assicurarti che la sequenza sia creata con un valore iniziale che sia maggiore di tutti gli ID esistenti nella tabella e che tutto ciò che esegue un inserimento utilizzi la sequenza solo in futuro.