# auto increment unter oracle?



## südpol (27. September 2005)

Hi,

ich habe eine Anwendung auf mysql Basis entwickelt und muss diese nun nach oracle portieren. Ich habe leider nicht sonderlich viel Ahnung von Oracle. Ein Freund von mir, der mir die Klasse umschreiben sollte hat mir nun gesagt, dass ich meine gesamte Anwendung umbauen muss, da ich in mysql auto increment beim insert Befehl benutzt habe. Oracle bietet hier wohl "nur" den Weg über trigger. Auch die Möglichkeit die letzte verwendete ID zu erfahren gibt es bei oracle scheinbar nicht.

Kann mir das jemand bestätigen oder (was mir viel lieber wäre) das Gegenteil aufzeigen?

Viele Grüße


----------



## vop (27. September 2005)

Oracle kennt sogenannte Sequenzen (entspricht etwa dem autoincrement).

 Lies mal in der Doku unter 
 CREATE SEQUENCE

 vop


----------



## südpol (27. September 2005)

HI,

ok Sequenzen setzen doch aber voaus, dass ich mir vorab eine ID besorge also z. B. so:

oracle:
- ID aus der Sequenz ziehen
- Datensatz mit der o. g. ID speichern
- Beziehungtabellen befüllen

mysql:
- Datensatz einfügen (und ID (auto increment) Feld leer lassen)
- soeben verwendete ID abfragen
- Beziehungstabellen befüllen

Somit muss ich auch in diesem Fall nicht nur die Datenbank Klasse anpassen sondern auch meinen Code, oder habe ich da was falsch verstanden?

Gruß


----------



## vop (27. September 2005)

Hmm. Da bleiben dann scheinbar wirklich nur Triggers.


 Aber es gibt die Möglichkeit, die zuletzt verwendete Nummer zu erfahren.
 Mit Sequenz.CURRENTVALUE (oder so ähnlich)

  vop


----------



## Exceptionfault (27. September 2005)

Ja, so ähnlich. Und du musst auch die ID nicht vorher auslesen.
Nehmen wir an unsere Sequence heisst mySEQ:

```
INSERT INTO kopftabelle VALUES ( mySEQ.NEXTVAL, Feld2, Feld3, ... );

INSERT INTO detailtabelle VALUES ( mySEQ.CURRVAL, Feldb, Feldc );
INSERT INTO detailtabelle VALUES ( mySEQ.CURRVAL, Feldd, Felde );
INSERT INTO detailtabelle VALUES ( mySEQ.CURRVAL, Feldf, Feldg );
```

mySEQ.CURRVAL kannst du nur ausführen, wenn du vorher auch einmal mySEQ.NEXTVAL ausgeführt hast. Auch wenn andere User in der Zwischenzeit NEXTVAL ausführen, bleibt dein CURRVAL unverändert.

Der große Vorteil bei Sequences im Vergleich zu AUTOINCREMENT ist, dass es ein Objekt unabhängig von Tabellen ist. D.h. du kannst eine ID in unterschiedlichen Tabellen verwenden um z.B. in mehreren Protokolltabellen die exakte Reihenfolge zu speichern. Oder eine Sequence die für externe Filenamen genutzt wird etc...


----------

