sql >> Database >  >> RDS >> Oracle

Oracle:verschil tussen max(id)+1 en sequence.nextval

Met de select max(id) + 1 benadering, zullen twee sessies die tegelijkertijd worden ingevoegd, dezelfde huidige maximale ID uit de tabel zien en beide dezelfde nieuwe ID-waarde invoegen. De enige manier om dit veilig te gebruiken, is door de tafel te vergrendelen voordat de transactie wordt gestart, wat pijnlijk is en de transacties serialiseert. (En zoals Stijn aangeeft, waarden kunnen opnieuw worden gebruikt als het hoogste record wordt verwijderd). Gebruik deze methode in principe nooit. (Er kan heel af en toe een dwingende reden zijn om dit te doen, maar ik weet niet zeker of ik er ooit een heb gezien).

De volgorde garandeert dat de twee sessies verschillende waarden krijgen en dat er geen serialisatie nodig is. Het zal beter presteren en veiliger zijn, gemakkelijker te coderen en gemakkelijker te onderhouden.

De enige manier waarop u dubbele fouten kunt krijgen met behulp van de reeks, is als er al records in de tabel bestaan ​​met ID's boven de reekswaarde, of als er nog steeds records worden ingevoegd zonder de reeks te gebruiken. Dus als u een bestaande tabel had met handmatig ingevoerde ID's, zeg 1 tot 10, en u een reeks hebt gemaakt met een standaard start-met-waarde van 1, zou de eerste invoeging die de reeks gebruikt, proberen een ID van 1 in te voegen - die al bestaat . Na dat 10 keer geprobeerd te hebben, zou de reeks je 11 opleveren, wat zou werken. Als u vervolgens de max-ID-benadering zou gebruiken om de volgende invoeging te doen die 12 zou gebruiken, maar de reeks zou nog steeds op 11 staan ​​en zou u ook 12 geven de volgende keer dat u nextval aanroept .

De volgorde en tabel zijn niet gerelateerd. De reeks wordt niet automatisch bijgewerkt als een handmatig gegenereerde ID-waarde in de tabel wordt ingevoegd, dus de twee benaderingen gaan niet samen. (Onder andere kan dezelfde volgorde worden gebruikt om ID's voor meerdere tabellen te genereren, zoals vermeld in de documenten).

Als u overstapt van een handmatige benadering naar een reeksbenadering, moet u ervoor zorgen dat de reeks wordt gemaakt met een start-met-waarde die hoger is dan alle bestaande ID's in de tabel, en dat alles wat een invoeging doet de reeks gebruikt alleen in de toekomst.



  1. Toestemming geweigerd bij het importeren van een CSV-bestand vanuit PGAdmin

  2. Het maken van een trigger voor het invoegen van een onderliggende tabel geeft een verwarrende fout

  3. Installeer Oracle Client vanaf de opdrachtregel zonder tussenkomst van de gebruiker

  4. Unicode-normalisatie in PostgreSQL 13