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 machenDas 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');