Gibt es auto_increment unter Oracle?
Nein. Jedoch kann auto_increment via Trigger emuliert werden.
Wer von MySQL nach Oracle portiert vermisst wohl als erstes das auto_increment Feature von MySQL Spalten. Dieses läßt sich jedoch unter der Nutzung von Sequences und Triggern bei Oracle erstellen:
rem Wir brauchen zum einen einen Zähler, rem der hochzählt (dazu die Sequence) create sequence zaehler_der_tabelle_xy increment by 1 start with 1 cache 2; rem Jetzt die eigentliche Tabelle CREATE TABLE xy ( id_xy NUMBER(20,0) PRIMARY KEY, bla_xy VARCHAR2(4000) ); rem Nun ist noch ein Trigger vonnöten, der rem die neue Id von der Sequence übergeben rem bekommt und vor dem insert diesen Wert rem auf die entsprechende Spalte überträgt: CREATE TRIGGER trigger_primary_key BEFORE INSERT ON xy REFERENCING NEW AS NEW OLD AS OLD FOR EACH ROW Begin select zaehler_der_tabelle_xy.nextval into :NEW.id_xy from DUAL; End; /Bei jedem insert wird nun der Wert von id_xy automatisch hochgesetzt. Zu beachten ist, dass es besser ist, für jede Tabelle eine eigene Sequence zu erstellen, denn sonst müssen sich alle Tabellen die fortlaufenden Zahlen teilen.
Alternativ kann auch ohne Trigger gearbeitet werden und die nächste Zahl per Hand selektiert werden:
$stmt=OCIParse($conn, "SELECT zaehler_der_tabelle_xy.nextval FROM DUAL"); OCIExecute($stmt); OCIFetch($stmt); $nextid=OCIResult($stmt, "NEXTVAL");Der aktuellen Wert der Sequenz zaehler_der_tabelle_xy kann durch Verwendung von currval (abgeleitet von Current Value) ermittelt werden. Mit dem folgenden Codestück ist es möglich, den zuletzt eingefügten Wert abzufragen:
// INSERT in die Tabelle $stmt = OCIParse($conn, "INSERT INTO xy (BLA_XY) VALUES 'BLA'"); OCIExecute($stmt, OCI_DEFAULT); //Abfrage der Sequence $stmt = OCIParse($conn,"SELECT zaehler_der_tabelle_xy.currval AS CV FROM DUAL"); OCIExecute($stmt, OCI_DEFAULT); OCIFetch($stmt); $last_id=OCIResult($stmt, "CV"); OCICommit($conn);Achtung: Das selektieren des currval funktioniert nur innerhalb derselben Transaktion (daher auch beim OCI_DEFAULT). Will man den aktuellen höchsten ID-Wert ermitteln, ist es besser, unter Verwendung der SQL-Funktion MAX() den höchsten Wert direkt aus der Tabelle abzufragen.
Org. Link
vireas - 13. Mai, 13:15