Oracle 9i ADD COLUMN mit auto increment möglich?

tplanitz

Erfahrenes Mitglied
Hallo Zusammen,

Problem: In Vorhandene Tabelle mit 400 Einträgen brauche ich eine Spalte "a_reg_id" die als Primärschlüssel angelegt werden soll. Es ist so das kein Primärschlüssel da war und ich jetzt eine Verknüfung mit anderen Tabellen hinkriegen muß. ICh weiß das es bei Oracle die "RAWID" gibt, diese nummeriert nur die Ausgebe.

Frage: Kann man wenn man die Spalte "a_reg_id" erstellt hat, diese dann automatisch befüllen so daß ich die IDs 1-400 in der Spalte zu stehen habe.Außerdem müsste "a_reg_id" mit jedem weiteren Eintrag in der Tabelle automatisch +1 zählen also 401, 402 usw.

Brauche hier dringend Unterstützung,

Vielen Dank im Voraus für die Hilfe

Thorsten
 
Hallo!

Mit "RAWID" meinst du wohl ROWID ... ;-) Das ist ein Oracle interner Wert der die Zeilen einer Tabelle Datenbankeindeutig(!) beschreibt. Ein anderer Interner Wert ist die ROWNUM. Dieser ist einfach nur ein Zähler der die Reihenfolge (nicht die sortierte...) der Datensätze beschreibt. Auf sie hat man beispielsweise in einem Select Zugang. Will an sich beispielsweise nur die ersten 5 Sätze der Ausgabe anzeigen kann man folgendes Schreiben: Select * fro bla where ROWNU < 6;

Du könntest beispielsweise eine sequence anlegen die dir die passenden Nummern für deine Tabelle generiert.

Code:
create sequence seq_a_reg_id start by 1 increment by 1;

An den aktuellen Wert der Sequence kommst du it:. currval
an den nächsten Wert mit nextval

Dann fügst du die Tabellenspalte ganz normal an mit:
Code:
alter table add column a_reg_id int;
Ich weis jetzt nicht ab du schon beim hinzufügen der Spalte die Sequence benutzen kannst, wär mal einen versuch Wert:
Als statt de obigen Befehl:
Code:
alter table add column a_reg_id int default seq_a_reg_id.nextval;

...

sollte das nicht gelingen must du jeden Datensatz mit der nächsten Zahl aus der Sequenz befüllen.

Danach solltest du einen PK Constraint auf die Tabelle legen.

Gruß Tom
 
Hallo,

vielen Dank für diesen Denkanstoß, klappt wunderbar. Wie kann man bestehende SequenzAnweisungen eigentlich weiter bearbeiten? Gibt es da eine ALTER oder UPDATE Anweisung

Bis jetzt habe ich es nur geschafft die sequenz mit "select seq_a_reg_id from user_sequences;" anzusehen.

Nur beim anlegen der tabelle und dem verwenden der Sequenz meckert oracle, aber das ist kein problem ich befülle die Spalte einfach mit ner for schleife, das geht ganz gut wenn die anderen Spalten NULL Werte erlauben.


Thorsten
 
Zuletzt bearbeitet:
Man sollte noch beachten, dass mit einem ALTER TABLE ADD die neue Spalte hinten angefügt wird. Besonders bei einem Primary key ist das einfach unschön zumal so schnell ROWCHAINING entstehen kann wenn zwischendrin auch noch not null Felder sind.

Ich würde dir etwa folgendes empfehlen:

Zuerst eine Sequenz anlegen. Dann ein

Code:
CREATE TABLE temp AS
  SELECT SEQUENCENAME.NEXTVAL AS a_reg_id, t.* FROM tabellenname t;

Danach testen ob alles geklappt hat... (SELECT * FROM temp)
Nun die alte Tabelle droppen (DROP TABLE tabellenname )
Die temporäre Tabelle umbenenne (ALTER TABLE temp RENAME TO tabellenname)
Und den Primary Key drauf setzen (
Code:
ALTER TABLE tabellenname ADD 
  CONSTRAINT PK_A_REG_ID
  PRIMARY KEY ( A_REG_ID )
  USING INDEX 
  TABLESPACE INDX

So sieht auch dein DESCRIBE hinterher schöner aus ;-)
 
Zurück