Oracle: Neue Spalte an bestimmter Position

Hallöchen,
ich habe eine Oracle-Tabelle: ADDON_USERS mit ca. 35 Spalten.

Nun soll eine Spalte hinzukommen.

Das klappt mit alter Table eigentlich ganz gut.

Aber dummerweise wird die neue Spalte ans Ende gestellt.

Ich hätte die neue Spalte aber gerne an 21. Position und nicht an 36…

Kann mir hier einer helfen?

Gruß

Sina

Hallo Sina,

vermutlich geht es nur über eine Zwischentabelle (aber Vorsicht, drop table ist ziemlich endgültig :wink:).

ALTER TABLE ADDON\_USERS add spalte36 varchar2(50); (z.B.)
Create table Temp as select spalte1, spalte2, ... , spalte35 as spalte20a, ... from ADDON\_USERS;
drop table ADDON\_USERS; 
create table ADDON\_USERS as select \* from temp;
drop table temp;

Gibt es Constraints?
Um die mußt Du dich gesondert kümmern.
Wieso interessiert eigentlich die Reihenfolge? Spalten werden über ihren Namen referenziert, nicht über ihre Position.

Gruß, muzel

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Muzel,
oha…scheint was größeres zu sein.
Weiß nicht, ob ich mich an sowas wirklich rantraue.

Das mit der Reihenfolge wäre interessant, denn ich gebe Teile der Tabelle über ein kleines Programm in Excel aus.
Den Select kann der Anwender frei definieren, aber nicht die Position, an der es angezeigt wird. Die Tabelle, um die es hier geht, hat 5 Statuskenzeichen, die momentan „nebeneinander“ liegen. Nun soll ein weiteres dazu kommen. Es würde sich halt besser machen, wenn die Statusfelder schön beinander wären…

Naja, ich werds mir überlegen, wie und ob ich das mache…
Ja, Constraints sind auch noch dabei (*schnüff*)

Gruß
Sina

ich habe eine Oracle-Tabelle: ADDON_USERS mit ca. 35 Spalten.
Nun soll eine Spalte hinzukommen.
Das klappt mit alter Table eigentlich ganz gut.
Aber dummerweise wird die neue Spalte ans Ende gestellt.
Ich hätte die neue Spalte aber gerne an 21. Position und nicht
an 36…
Kann mir hier einer helfen?

Hallo Sina!

Mach’s doch so (ich verwende der Übersichtlichkeit eine Beispieltabelle):

CREATE TABLE my\_tab(a NUMBER, c NUMBER);
ALTER TABLE my\_tab ADD (b NUMBER);
ALTER TABLE my\_tab RENAME TO my\_tab\_t;
CREATE OR REPLACE VIEW my\_tab AS SELECT a, b, c FROM my\_tab\_t;

Voilá!
Es ist übriges wirklich keine gute Idee sich auf die Reihenfolge und/oder Anzahl der Spalten in einer Tabelle zu verlassen. Sowas hier:

INSERT INTO my\_tab VALUES(1,2,3);

ist gaaaaaanz böse! Richtig wäre natürlich:

INSERT INTO my\_tab(a,b,c) VALUES(1,2,3);

Gruß
Martin

Hallo Martin,
das ist eine tolle Idee,
ich denke so kann ich es machen :smile:

Vielen Dank

Gruß

Sina

Hi!

Es ist übriges wirklich keine gute Idee sich auf die
Reihenfolge und/oder Anzahl der Spalten in einer Tabelle zu
verlassen. Sowas hier:

INSERT INTO my_tab
VALUES(1,2,3);

ist gaaaaaanz böse! Richtig wäre
natürlich:

INSERT INTO my_tab(a,b,c) VALUES(1,2,3);

Wieso? Ich mach das immer so … :wink:

insert into dual values ('X');
commit

Grüße,
Tomh

PS: Bitte nicht ausprobieren!!! In manchen Versionen funktioniert das WIRKLICH!

Hi Tom!

Wieso? Ich mach das immer so … :wink:

insert into dual values (‚X‘);
commit

Ist aber falsch! Musst du so schreiben:

insert into dual(dummy) values ('X');
commit;

PS: Bitte nicht ausprobieren!!! In manchen Versionen
funktioniert das WIRKLICH!

Was heisst hier in manchen? Das geht in allen (zumindest in denen, die ich auf die schnelle jetzt ausprobiert hab: 9.2.0.6 und 10.1.0.4, bei 8.1.7 [ist bei mir leider schon überall rausgeflogen] ging’s glaube ich sogar noch mit einfachen dba-Rechten, jetzt will er zumindest den SYS).

Gruß,
Martin

Hi Martin!

Ist aber falsch! Musst du so schreiben:

insert into dual(dummy) values (‚X‘);
commit;

Das kommt davon, wenn man’s nicht ständig macht (sondern nur mal so zum Spaß auf einer produktiven DB ausprobiert hat) - ich sollte wieder mal mehr üben …

Was heisst hier in manchen? Das geht in allen (zumindest in
denen, die ich auf die schnelle jetzt ausprobiert hab: 9.2.0.6
und 10.1.0.4, bei 8.1.7 [ist bei mir leider schon überall
rausgeflogen] ging’s glaube ich sogar noch mit einfachen
dba-Rechten, jetzt will er zumindest den SYS).

Auf einer 8.1.7 funktioniert’s als reiner DBA - aber man kommt ja sowieso beinahe überall als sys/***************** rein.

Ich dachte mich zu erinnern, daß irgendwann mal auf einer Oracle-Marketingveranstaltung - pardon: „Workshop“ - der Satz fiel, das Manipulationen auf DUAL nimmer möglich sind …

Grüße,
Tomh