Oracle Sequence Table - Index count with myTableSequence.nextval

RDBMS - Primary Key Field - Primärschlüssel

In einem RDBMS (Relational Database Management System,
brauchen Tabellen einen Index,
oder anders gesagt eine ID, also eine Identifikationsnummer.

Prinzipiell kann man die ID selbst gestallten, wie man will.
Es könnten numerische Werte und oder alphanumerische Werte sein.

Man kann die ID nur aus einen Schlüsselfeld (Keyfield = Primary Key Field) bilden,
oder man kombiniert mehrere Tabellen Spalten,
zu einer Gruppe von Schlüsselfeldern (Primary Key Fields).

Wörtlich übersetzt bedeutet PRIMARY = Primär, Hauptsächlich, Grundlegend...
Daher auch verwendet man auch das deutsche Wort Primärschlüssel.

Es gibt bei RDBMS noch andere Schlüsseln, wie Superschlüssel, Fremdschlüssel,
Sekundärschlüssel, Alternativschlüssel und so weiter...
Die ich aber nicht im Detail erklären möchte.

Ich bleibe bei den Primärschlüsseln,
bzw. Wie man eine der Tabellen ID anlegen und verwalten kann.
Der Primarykey eine Tabelle dient dazu, einen Datensatz eindeutig zu Identifizieren.
Also er besteht aus einer Zahlen- oder Buchstabenkombination,
welche eindeutig ist und auch in der Tabelle nicht doppelt vor kommen wird (kann und darf!).

Um diese Eindeutigkeit (Unique) zu erreichen kann man Schlüsselkandidaten kombinieren,
oder einfach einen Tabellen Index aus eine fortlaufenden Nummer anlegen.
Wichtig ist, dass man am eine einer UniqueKey hat,
der entweder aus einer Spalte (primary key) besteht oder aus einer Gruppe von primary keys.

Wie verwaltet man den UniqueKey?
Nun könnte ich vor jedem neuen Eintrag (Insert into Table...)
- die Primarykey Column lesen (Select MAX(column)...)
- den letzen Wert jeweisl um eins erhöhen (last ID +1)


Select MAX(ColumnID) as MAXID+1 from Table;

- und dann den INSERT mit dem Unique Key machen


Das ist theoretisch möglich,
funktioniert aber nur bedingt, also eher nicht zu empfehlen.
Denn wenn 2 Besucher gleichzeitig einen Eintrag machen,
kann es passieren, dass die last MAX-ID den gleichen Wert hatte,
und somit den INSERT beim ersten noch klappt,
aber der 2.INSERT fehl schlägt, weil der Primary Key schon belegt ist.

Um solche Überschneidungen auszuschließen,
empfiehlt es sich eine SEQUENCE Table an zu legen.
Denn hier wird die neue ID zeitnah mit dem Insert abgefragt (nextval)
Und verhindert doppelte Unique Key (primary key) vergaben und somit doublicate key errors.

Sequence Object in MS-SQL und Oracle

Es folgt nun also ein Beispiel,
wie man bei einer Oracle Datenbank eine SEQUENCE Table anlegt und nutzt.

Nebenbei möchte ich noch erwähnen,
es gibt hierzu auch beim MS-SQL Datenbanken auch eine äquivalente Variante.
Seit MS-SQL Server 2012 kann man Sequence Object nutzen,
und sequenzielle numerische Werte generieren.

Beispiel: MS-SQL Server 2012 Sequence Object


CREATE SEQUENCE Schema.SequenceName AS int  INCREMENT BY 1;

Aber darauf möchte ich nicht weiter darauf eingehen,
denn mein folgendes Beispiel ist für ORACLE Sequences gedacht

Beispiel: creating Oracle Sequences

CREATE SEQUENCE myTableSequence
      INCREMENT BY 1
      START WITH 1
      NOMAXVALUE
      NOCYCLE
      CACHE 10;

Der INCREMENT steht hier für die Erhöhung der Werte.
Also es wird immer plus 1 erhöht.

Den Startwert START WITH kann man auch beliebig festlegen (Start with 1000012).

Empfehlensert ist die NOMAXVALUE Einstellung,
damit quasi die ID unendlich sein kann,
geht aber leider nur bis 1027 (zehn hoch siebenundzwanzig).

Das NOCYCLE steht dafür,
dass falls der Maximalwert oder der Minimalwert erreicht wurde,
nicht wieder beim Anfangs Minimalwert oder Maximalwert angefange werden soll.
Falls man das aber doch möchte,
gibt man einfach CYCLE ein, dann hat man einen Zyklus.

Der CACHE deffiniert,
wie viel Werte von der Sequence im Speicher (Memory) vorgehalten werden,
um schnellen Zugriff zu ermöglichen.
Der Minimalwert hierür ist 2. Fall es zu eine Systemabsturz kommen sollte,
gehen die im Speicher (Memory) vorbelegten (preallocated) Werte leider verloren.

Und der NOORDER ist eine Standard Einstellung,
die dazu führt, dass man nicht garantieren kann, das Sequence Nummern
in der Reihenfolge der Anfragen (requests) erstellt werden.
Also die Anfragenreihenfolge ist nicht zwingend gleichzeitig auch die fortlaufende Sequence-Nummer.

So könnte die fertige Oracle Sequence aussehen:

Using Oracle Sequences with NEXTVAL

Nun ist der Rest kinderleicht.
Denn nun möchten wir das erzeugte Sequence Object,
für jeden neuen Eintrag in der Datenbank Tabelle nutzen um einen unique Primary Key zu erhalten.

Hier muss lediglich bei jedem INSERT Into Table die myTableSequence.NEXTVAL einbezogen werden.

Beispiel: Insert Table mit Sequence NextVal


INSERT INTO myNewTable (myKey, CustomerName)  VALUES (myTableSequence.NEXTVAL, 'Raimund Stachowiak');



Comments

No comments yet.

Add Comment

* Required information
(never displayed)
 
Bold Italic Underline Strike Superscript Subscript Code PHP Quote Line Bullet Numeric Link Email Image Video
 
Smile Sad Huh Laugh Mad Tongue Crying Grin Wink Scared Cool Sleep Blush Unsure Shocked
 
1000
Enter the word hand backwards.
 
Enter answer:
Captcha
Refresh
 
Enter code:
 
Notify me of new comments via email.
 
Remember my form inputs on this computer.
 
I have read and understand the privacy policy. *
 
I have read and agree to the terms and conditions. *
 
 
Powered by Commentics