Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Oracle:Unterschied zwischen max(id)+1 und sequence.nextval

Mit dem select max(id) + 1 Ansatz sehen zwei Sitzungen, die gleichzeitig eingefügt werden, dieselbe aktuelle maximale ID aus der Tabelle, und beide fügen denselben neuen ID-Wert ein. Die einzige Möglichkeit, dies sicher zu verwenden, besteht darin, die Tabelle vor dem Start der Transaktion zu sperren, was schmerzhaft ist und die Transaktionen serialisiert. (Und wie Stijn betont, können Werte wiederverwendet werden, wenn der höchste Datensatz gelöscht wird). Grundsätzlich sollten Sie diesen Ansatz niemals verwenden. (Es mag gelegentlich einen zwingenden Grund dafür geben, aber ich bin mir nicht sicher, ob ich jemals einen gesehen habe).

Die Sequenz garantiert, dass die beiden Sitzungen unterschiedliche Werte erhalten, und es ist keine Serialisierung erforderlich. Es wird eine bessere Leistung erbringen und sicherer, einfacher zu programmieren und zu warten sein.

Die einzige Möglichkeit, doppelte Fehler bei der Verwendung der Sequenz zu erhalten, besteht darin, dass in der Tabelle bereits Datensätze mit IDs über dem Sequenzwert vorhanden sind oder wenn immer noch Datensätze eingefügt werden, ohne die Sequenz zu verwenden. Wenn Sie also eine vorhandene Tabelle mit manuell eingegebenen IDs hätten, sagen wir 1 bis 10, und Sie eine Sequenz mit einem Standardstartwert von 1 erstellt haben, würde die erste Einfügung, die die Sequenz verwendet, versuchen, eine ID von 1 einzufügen - die bereits existiert . Nachdem Sie das 10 Mal versucht haben, würde die Sequenz 11 ergeben, was funktionieren würde. Wenn Sie dann den Max-ID-Ansatz verwenden würden, um die nächste Einfügung durchzuführen, die 12 verwenden würde, aber die Sequenz wäre immer noch auf 11 und würde Ihnen auch 12 geben, wenn Sie das nächste Mal nextval aufrufen .

Die Sequenz und die Tabelle sind nicht verwandt. Die Sequenz wird nicht automatisch aktualisiert, wenn ein manuell generierter ID-Wert in die Tabelle eingefügt wird, sodass sich die beiden Ansätze nicht vermischen. (Unter anderem kann dieselbe Sequenz verwendet werden, um IDs für mehrere Tabellen zu generieren, wie in der Dokumentation erwähnt).

Wenn Sie von einem manuellen Ansatz zu einem sequenziellen Ansatz wechseln, müssen Sie sicherstellen, dass die Sequenz mit einem Start-mit-Wert erstellt wird, der höher ist als alle vorhandenen IDs in der Tabelle, und dass alles, was eine Einfügung durchführt, die Sequenz verwendet erst in der Zukunft.