Oracle: Differenz zwischen max(id)+1 und Sequenz.nextval
Ich bin mit Oracle
Was ist der Unterschied, wenn wir ID
mit max(id)+1
und mit sequance.nexval
,wo und Wann?
Wie:
insert into student (id,name) values (select max(id)+1 from student, 'abc');
und
insert into student (id,name) values (SQ_STUDENT.nextval, 'abc');
SQ_STUDENT.nextval
irgendwann gibt Fehler, Datensatz duplizieren...
bitte helfen Sie mir, diese Zweifel
InformationsquelleAutor Priya Prajapati | 2013-06-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mit der
select max(id) + 1
Ansatz, zwei sessions einsetzen, gleichzeitig sehen den gleichen Strom max ID aus der Tabelle, und beide legen die gleiche neue ID-Wert. Der einzige Weg, um dies sicher ist, um die Tabelle zu sperren, bevor die Transaktion, die schmerzhaft ist, und serialises der Transaktionen. (Und wie Stijn Punkte heraus, die Werte können wiederverwendet werden, wenn der höchste Eintrag wird gelöscht). Grundsätzlich nie verwenden diesen Ansatz. (Es kann sehr selten ein zwingender Grund sein, so zu tun, aber ich bin mir nicht sicher, ob ich jemals einen gesehen).Den Reihenfolge garantiert, dass die zwei Sitzungen, um die verschiedenen Werte, und nicht serialisieren benötigt wird. Es wird sich besser und sicherer, einfacher zu Programmieren und einfacher zu warten.
Nur so können Sie doppelte Fehler mit der Sequenz ist, wenn die Datensätze bereits in der Tabelle vorhanden sind mit IDs über der Sequenz-Wert, oder wenn etwas ist immer noch das einfügen von Datensätzen ohne mit der Reihenfolge. Also, wenn Sie hatte eine vorhandene Tabelle mit manuell eingegebenen IDs, sagen wir 1 zu 10, und Sie erstellt eine Sequenz mit einem Standard-start-mit-Wert 1, die erste insert-Anweisung mit der Reihenfolge versuchen würde, legen Sie eine 1-ID bereits existiert. Nach dem Versuch, die 10-mal die Reihenfolge geben würde, Sie 11, die funktionieren würde. Wenn Sie dann den max-ID-Ansatz zu tun, das nächste einfügen, 12, aber die Reihenfolge wäre immer noch auf 11 und würde Ihnen auch die 12 nächsten mal, wenn Sie aufgerufen
nextval
.Die Reihenfolge und die Tabelle sind nicht verwandt. Die Sequenz wird nicht automatisch aktualisiert, wenn ein manuell-generierten ID-Wert wird in die Tabelle eingefügt werden, so dass die beiden Ansätze nicht miteinander vereinbar sind. (Unter anderem, der gleichen Sequenz kann verwendet werden zum generieren von IDs für mehrere Tabellen, wie erwähnt, in den docs).
Wenn Sie die änderung von einem manuellen Ansatz zu einer Sequenz Ansatz, die Sie benötigen, um sicherzustellen, dass die Sequenz wird erstellt mit einem start-Wert, der höher ist als alle vorhandenen IDs in der Tabelle, und das alles, dass macht ein insert verwendet die Sequenz erst in der Zukunft.
InformationsquelleAutor Alex Poole
Unter Verwendung einer Sequenz funktioniert, wenn Sie die Absicht haben mehrere Benutzer. Mit einem
max
nicht.Wenn Sie eine
max(id) + 1
und Ihnen ermöglichen, mehrere Benutzer, mehrere Sitzungen, die beide Betriebssysteme zur gleichen Zeit wird regelmäßig das gleiche sehenmax
und somit erzeugen die gleichen neuen Schlüssel. Unter der Annahme, die Sie konfiguriert haben, müssen Sie die Marker richtig, dass wird ein Fehler generiert, müssen Sie behandeln. Sie werden handle es durch wiederholen derINSERT
was kann scheitern, wieder und wieder, wenn andere sessions block, den Sie vor Ihrer Sitzung Wiederholungen, aber das ist eine Menge zusätzlichen code für jedenINSERT
Betrieb.Wird es auch serialisieren Sie Ihre code. Wenn ich eine neue Zeile einfügen in meine Sitzung, und gehen zum Mittagessen, bevor ich mich erinnern zu Begehen (oder mein client-Anwendung stürzt ab, bevor ich Begehen kann), alle anderen Benutzer werden daran gehindert, eine neue Zeile einfügen, bis ich wieder komme und zu Begehen, oder die DBA tötet meine session, erzwingen einen Neustart.
da Ihre Reihenfolge, der aktuelle Wert ist niedriger als die maximale ID in der Tabelle. Die Reihenfolge wird nicht geändert, wenn Sie manuell einfügen ein Wert in der Tabelle. Sie sollten nicht mischen Sie die beiden Ansätze - Holen Sie sich die Reihenfolge, so dass es höher ist als die Werte in der Tabelle, und verwenden Sie anschließend nur die Reihenfolge.
Danke für die Antwort, es könnte der Grund für Fehler
InformationsquelleAutor Justin Cave
Hinzufügen, um die anderen Antworten, ein paar Fragen.
Ihre max(id)+1-syntax wird auch fehlschlagen, wenn es keine Zeilen in der Tabelle bereits, so verwenden:
Es ist nichts falsch mit dieser Technik, wenn Sie nur einen einzigen Prozess, der Einsätze in den Tisch, als könnte der Fall mit einem data warehouse laden, und wenn max(id) ist schnell (was es wahrscheinlich auch ist).
Es vermeidet auch die Notwendigkeit, code zu synchronisieren Werte zwischen Tabellen und Sequenzen wenn Sie sich bewegen, die Wiederherstellung von Daten auf ein test-system, zum Beispiel.
Können Sie erweitern diese Methode, um mehrere Zeilen einzufügen, durch den Einsatz von:
Erwarte ich, dass vielleicht serialise eine parallele legen, obwohl.
Einige Techniken funktionieren nicht gut mit diesen Methoden. Sie verlassen sich natürlich auf die Möglichkeit zur Ausgabe der select-Anweisung, SQL*Loader kann ausgeschlossen werden. Jedoch SQL*Loader bietet die Unterstützung für diese Technik im Allgemeinen durch die SEQUENZ-parameter der Spalte Spezifikation: http://docs.oracle.com/cd/E11882_01/server.112/e22490/ldr_field_list.htm#i1008234
Ein Hinweis wurde Hinzugefügt, und erweitert den Kommentar auf den SQL*Loader.
InformationsquelleAutor David Aldridge
Vorausgesetzt, MAX(ID) ist eigentlich schnell genug wäre, wäre es nicht möglich:
In diesem Fall würde ich eine komplett stabile Verfahren und die manuellen Einsätze würde auch erlaubt sein, ohne sich Gedanken über die Aktualisierung der Sequenz
max(id)
Wert, obwohl dienextval
anrufen sollte, damit es funktioniert. Sie können nicht in reinem SQL aber, und so dass ein mix ist immer noch chaotisch. Ein weiterer ähnlicher Ansatz ist der Versuch, das einfügen mitnextval
in einer Schleife beenden, wenn Sie nicht Holen Sie sich ein ORA-00001, vorausgesetzt, es ist ein PK/UK auf die Spalte. Das verhindert, dass zu suchen, der max, und füllt die Lücken, die kann oder kann nicht wünschenswert sein. Immer nur mit der Reihenfolge ist einfacher, obwohl...InformationsquelleAutor Stefanos Kargas