2010-03-16 12 views
5

Ich verwende DB2 v9 auf LUW.Wie bekomme ich den nächsten Wert, der für eine IDENTITY-Spalte verwendet wird

Ich habe eine Spalte wie folgt definiert:

"ID" BIGINT NOT NULL GENERATED BY DEFAULT
AS IDENTITY (START WITH 1, INCREMENT BY 1, CACHE 20,
NO MINVALUE, NO MAXVALUE, NO CYCLE, NO ORDER),

Ich mag den besten Weg, wissen, um zu bestimmen, was der nächste Wert für die ID-Spalte beim nächsten Mal wird ein Datensatz in die Tabelle eingefügt wird .

Ich werde diese Informationen verwenden, um ein Skript zu schreiben, um eine "Vernunft" -Prüfung in der Tabelle vorzunehmen, IDENTITY ist noch intakt und der nächste Wert ist eins größer als der höchste Wert in der ID-Spalte.

Ich möchte nicht nur den Wert blind zurücksetzen. Wenn die Tabelle die Plausibilitätsprüfung nicht besteht, möchte ich benachrichtigt werden, damit ich feststellen kann, wodurch IDENTITY "wacked" wird.

+0

Dies ist für einen Offline-Test vorgesehen, während die Datenbank nicht anderweitig verwendet wird. Es gibt keine Probleme mit Personen, die Datensätze löschen, während der Test ausgeführt wird. –

Antwort

1

Sie können die nächste Identität nicht bestimmen. Selbst wenn Sie das Risiko eingehen könnten, dass die Daten nicht synchron sind, wenn Sie versuchen, einen neuen Datensatz zu erstellen. Das einzige, was zu tun ist, ist einen neuen Datensatz zu erstellen und die neue Identität zu erhalten, Ihre Überprüfung durchzuführen und dann den Datensatz mit dem Rest der Daten zu aktualisieren.

Sie können SELECT IDENT_CURRENT ('yurtablename') verwenden, um den letzten erzeugten zu erhalten. Dieselbe Einschränkung wie oben. Das funktioniert in T-SQL, nicht sicher in DB2 Flavor.

+0

Ich glaube nicht, dass die vorherige Identität funktionieren wird, da im Falle einer neuen Ladung möglicherweise keine vorherige Identität vorhanden war. Es sei denn, ein Reseed setzt auch vorherige Identität? –

+0

Ihre Idee, einen neuen Datensatz zu erstellen, könnte funktionieren. Ich möchte die Platte jedoch nicht bevölkern. Dies ist nur eine Prüfung und nicht beteiligt beim Erstellen von Datensätzen. Ich könnte einen neuen Datensatz erstellen, den Wert der identify-Spalte abrufen und dann einen Rollback ausführen. Weiß jemand, ob ein Rollback auch einen Rollback auf den Seed-Wert ausführt? Ich würde lieber nicht jedes Mal, wenn ich den Test führe, einen Seed-Wert erhöhen. –

+0

Dies ist der Weg zu gehen. Mach dir keine Sorgen über die Lücken. Selbst mit einer vorzeichenlosen 32-Bit-Ganzzahl können Sie 136 Zeilen lang pro Tag, dh 24 Stunden pro Tag, 136 Jahre lang einfügen, bevor Sie ablaufen. –

1

Ich glaube nicht, das wird so funktionieren, wie Sie es erwarten. Betrachten Sie den Fall, in dem eine Zeile eingefügt wird, und bevor eine weitere Zeile eingefügt wird, wird diese Zeile gelöscht. An diesem Punkt ist die automatisch generierte ID (mindestens) 2 größer als der höchste Wert in der DB und es wird korrekt sein. Wenn Sie garantieren können, dass keine Löschungen stattfinden, könnte es funktionieren, aber ich bin mir nicht sicher, welche Verwendung es wäre.

Im Wesentlichen überprüfen Sie, ob die grundlegenden Funktionen der DB-Software funktionieren und wenn nicht, was werden Sie tun? Händler wechseln?

Wenn der Fall ist, dass Sie einfach die Identitätsspalte neu zu resedieren, dann tun Sie eine Auswahl max (id) und resed die Spalte innerhalb der gleichen Transaktion. Sie können sicher sein, dass während der Neusetzung der Spalte keine neuen Datensätze eingefügt werden, indem serialisierbare Transaktions-Semantiken auf Isolationsstufe durchgesetzt werden.

+0

Ich überprüfe nicht, ob die grundlegenden Operationen von DB2 funktionieren. Ein Beispiel von dem, was ich fangen könnte, ist eine falsch ausgeführte Ladeoperation. Ich kann mein Skript jeden Tag vor Geschäftsbeginn ausführen.Wenn ich ein Problem finde, kann ich herausfinden, wer/was die betroffene Tabelle verändert hat, und eine Diskussion über den richtigen Weg zum Laden der Daten führen. Ich bin froh, ein paar falsche Positive für den Fall von Daten zu bekommen, die gelöscht werden. Wenn ich zu viele falsche Positive bekomme, kann ich einfach einen größeren Bereich als 1 testen. –

+0

@Michael - Sie sagen also, dass jemand den Identity Insert einschalten könnte, dann vergessen Sie, die Spalte neu zu setzen, um sie höher als die letzte zu setzen ID sie später eingefügt? Sie können dies testen, indem Sie einfach den maximalen ID-Wert lesen, eine Einfügung mit "gültigen" Daten durchführen, prüfen, ob es erfolgreich ist oder fehlschlägt und eine ID größer als die beobachtete hat, dann diese Zeile löschen - alles innerhalb einer einzigen Transaktion. Dies würde einige "leere" IDs in die Sequenz einführen, würde aber die Art von Problem erkennen, das ich beschrieben habe. – tvanfosson

+0

Ja, das ist die Art von Problem, das ich versuche zu fangen. Ich hoffe, dass jemand eine Lösung hat, die keine leeren IDs erstellt. Es wäre nicht das Ende der Welt, wenn ich jedes Mal, wenn ich das Skript ausführe, eine leere ID hätte, aber im Idealfall möchte ich das vermeiden. –

0

Wenn ID-Spalte auf GENERATED BY ALWAYS gesetzt ist, hätten Sie kein Problem mit falschem Laden/Importieren. Außerdem kann die IDENTITY_VAL_LOCAL-Funktion zum Abrufen des Identitätswerts verwendet werden.
Weitere Informationen zu dieser Funktion here

Verwandte Themen