Spalte mit fortlaufender Nummer erzeugen

By Lothar
    Aufgabenstellung:

Für eine bestehende Tabelle in Oracle soll eine neue Spalte hinzugefügt werden, die eine eindeutige, fortlaufende Nummer beinhaltet.

    Lösungsansatz:

Es bieten sich je nach Größe, Umfang der Tabelle verschiedene Lösungsansätze an. Im folgenden möchte ich eine Lösung zeigen, die mittels einer Sequenz und eines Triggers automatisch beim Einfügen von neuen Zeilen einen Zähler hochzählt und diese Werte in die neue Spalte einfügt. Da ich für dieses Lösungsansatz die komplette Tabelle kopiere, eigent sich dieses Verfahren nicht unbedingt für sehr grosse Tabellen im GByte Bereich.

    Durchführung:

1. Die neue Tabelle „tab_bck“ als kopie der Tabelle „tab_org“ erstellen:

create table tab_bck as select * from tab_org;

2. Den Inhalt der neu erstellten Tabelle löschen, da alle Zeilen später neu, per insert eingefügt werden sollen:

truncate table tab_bck;

3. In der neu erstellten tabelle eine neue Spalte vom Typ number einfügen:

ALTER TABLE tab_bck ADD („MYID“ NUMBER);

4. Den primary key für die Eindeutigkeit einzufügenden Zahlenwerte einstellen:

ALTER TABLE tab_bck ADD CONSTRAINT ora_bck_pk PRIMARY KEY( „MYID“ ) ENABLE;

5. Eine sequence erzeugen, die den Startwert vorgibt, ggf. zusätzliche Parameter definieren:

CREATE SEQUENCE MY_SEQ START WITH 1000;

6. Den Trigger anlegen, der bei jedem insert in die Tabelle org_bck die eindeuten Zalenwert in die Spalte myid einträgt.

create or replace trigger my_auto_insert
before insert on tab_bck
for each row
begin
select my_seq.nextval into :new.myid from dual;
end;
/

7. Alle Spalten der Tabelle „tab_org“ auslesen in die Tabelle „tab_bck“ schreiben, gleichzeitig wird der eindeutige Zahlenwert automatisch eingefügt:

select spalte1, spalte2, spalte3 from tab_org insert into tab_bck (spalte1, spalte2, spalte3 );

Schlagworte: , , , , , ,

Eine Antwort zu „Spalte mit fortlaufender Nummer erzeugen“

  1. Jens K. sagt:

    Hallo!

    Wäre folgendes nicht einfacher:

    CREATE TABLE
    tab_bck AS SELECT ROWNUM+1000 myid, x.* FROM (SELECT * FROM tab_org). Natürlich müssten neue Datensötze dann über Trigger Sequence oder max (myid) + 1 gefüllt werden.

    Übrigens schönes Blog!

    Grüße Jens

Eine Antwort schreiben