it-swarm.com.de

Wie füge ich eine Spalte in einer bestimmten Position in Oracle ein, ohne die Tabelle zu löschen und neu zu erstellen?

Ich habe ein bestimmtes Szenario, in dem ich zwei neue Spalten in eine vorhandene Tabelle in Oracle einfügen muss. Ich kann den Tisch nicht fallen lassen und neu erstellen. So kann es mit allen Mitteln erreicht werden?

19
Amit

Amit-

Ich glaube nicht, dass Sie irgendwo eine Spalte hinzufügen können, außer am Ende der Tabelle, sobald die Tabelle erstellt wurde. Eine Lösung könnte sein, dies zu versuchen:

CREATE TABLE MY_TEMP_TABLE AS
SELECT *
FROM TABLE_TO_CHANGE;

Löschen Sie die Tabelle, der Sie Spalten hinzufügen möchten:

DROP TABLE TABLE_TO_CHANGE;

Es ist an dem Punkt, an dem Sie die vorhandene Tabelle von Grund auf neu erstellen können, indem Sie sie in den gewünschten Spalten hinzufügen. Sie nehmen an, dass Sie in dieser Übung die Spalten "COL2 und COL3" hinzufügen möchten.

Fügen Sie nun die Daten wieder in die neue Tabelle ein: 

INSERT INTO TABLE_TO_CHANGE (COL1, COL2, COL3, COL4) 
SELECT COL1, 'Foo', 'Bar', COL4
FROM MY_TEMP_TABLE;

Wenn die Daten in Ihre "neu-alte" Tabelle eingefügt werden, können Sie die temporäre Tabelle löschen.

DROP TABLE MY_TEMP_TABLE;

Dies ist häufig der Fall, wenn ich Spalten an einem bestimmten Ort hinzufügen möchte. Wenn dies ein Online-Produktionssystem ist, ist es offensichtlich nicht praktikabel, sondern nur eine mögliche Idee.

-CJ

17
CJ Travis

Sie können die Position der Spalte (noch) nicht mit ALTER TABLE wählen: Sie kann nur am Ende der Tabelle hinzugefügt werden. Sie können die Spalten natürlich in beliebiger Reihenfolge auswählen, es sei denn, Sie verwenden die SELECT * FROM-Spaltenreihenfolge.

Wenn Sie sie wirklich in einer bestimmten Reihenfolge haben müssen und Sie die Tabelle nicht löschen und erneut erstellen können, können Sie stattdessen Spalten löschen und erneut erstellen: -

Kopieren Sie zuerst die Tabelle

CREATE TABLE my_tab_temp AS SELECT * FROM my_tab;

Dann löschen Sie die Spalten, die Sie nach der Spalte einfügen möchten, die Sie einfügen möchten

ALTER TABLE my_tab DROP COLUMN three;

Fügen Sie nun die neue Spalte (zwei in diesem Beispiel) und die von Ihnen entfernte hinzu.

ALTER TABLE my_tab ADD (two NUMBER(2), three NUMBER(10));

Fügen Sie zuletzt die Daten für die neu erstellten Spalten hinzu

UPDATE my_tab SET my_tab.three = (SELECT my_tab_temp.three FROM my_tab_temp WHERE my_tab.one = my_tab_temp.one);

Offensichtlich wird Ihr Update höchstwahrscheinlich komplexer sein und Sie müssen mit Indizes und Einschränkungen umgehen und können dies in einigen Fällen (LOB-Spalten usw.) nicht verwenden. Außerdem ist dies eine ziemlich abscheuliche Methode - aber die Tabelle wird immer vorhanden sein und Sie erhalten die Spalten in der gewünschten Reihenfolge. Aber ist die Kolonnenordnung wirklich so wichtig?

5
Lunc

Obwohl dies etwas alt ist, möchte ich eine leicht verbesserte Version hinzufügen, die die Spaltenreihenfolge wirklich ändert. Hier sind die Schritte (vorausgesetzt, wir haben eine Tabelle TAB1 mit den Spalten COL1, COL2, COL3):

  1. Fügen Sie der Tabelle TAB1 eine neue Spalte hinzu:
alter table TAB1 add (NEW_COL number);
  1. Tabelle beim Ändern der Spaltenreihenfolge in temporären Namen "kopieren" UND die neue Spalte umbenennen:
create table tempTAB1 as select NEW_COL as COL0, COL1, COL2, COL3 from TAB1;
  1. vorhandene Tabelle löschen:
drop table TAB1;
  1. benennen Sie den temporären Tabellennamen in den gerade abgelegten Tabellennamen um:
rename tempTAB1 to TAB1;
5
Gerd

In 12c können Sie die Tatsache nutzen, dass Spalten, die von unsichtbar auf sichtbar gesetzt sind, als letzte Spalte der Tabelle angezeigt werden: Tipps und Tricks: Unsichtbare Spalten in Oracle Database 12c

Vielleicht ist das der 'Trick', über den @efeffrey-kemp in seinem Kommentar gesprochen hat, aber der Link dort funktioniert nicht mehr.

Beispiel:

ALTER TABLE my_tab ADD (col_3 NUMBER(10));
ALTER TABLE my_tab MODIFY (
  col_1 invisible,
  col_2 invisible
);
ALTER TABLE my_tab MODIFY (
  col_1 visible,
  col_2 visible
);

Col_3 wird jetzt zuerst in einer SELECT * FROM my_tab-Anweisung angezeigt.

Hinweis: Dadurch wird die physische Reihenfolge der Spalten auf der Festplatte nicht geändert. In den meisten Fällen möchten Sie dies jedoch ohnehin nicht tun. Wenn Sie die physische Reihenfolge wirklich ändern möchten, können Sie das Paket DBMS_REDEFINITION verwenden.

0
dr fu manchu