webentwicklung-frage-antwort-db.com.de

Ordnen Sie die Tabellenspalten in Oracle neu an

Ich habe eine Tabelle mit mehr als 50 Spalten und muss die Reihenfolge der ersten beiden Spalten vertauschen. Wie kann ich dies am besten mit Oracle erreichen? Angenommen, der Tabellenname ist ORDERDETAILS. Die ersten beiden Spalten lauten ITEM_ID und ORDER_ID. Nachdem die Umbenennung abgeschlossen ist, sollte der Tabellenname noch ORDERDETAILS lauten, die ersten beiden Spalten sind jedoch ORDER_ID und ITEM_ID. FWIW, Spaltentypen und der Rest der Spalten und ihre Reihenfolge sind unerheblich.

Korrigieren Sie mich, wenn ich falsch liege, aber ich denke, die allgemeinen Schritte sind:

  1. Benennen Sie die vorhandene Tabelle um.
  2. Löschen Sie die Primärschlüsseleinschränkung.
  3. Erstellen Sie die Tabelle mit der richtigen Spaltenreihenfolge neu.
  4. Listenpunkt
  5. Führen Sie INSERT INTO .. ​​SELECT aus, um die Daten in Schritt 3 von Temp in die Tabelle zu verschieben.
  6. Lassen Sie die Temp-Tabelle fallen.

Ich habe wenig Erfahrung mit Oracle, vielleicht fehlen mir ein oder zwei Schritte.

Bedeutet ein Primärschlüssel einen Index in Oracle? Fällt das Löschen des Primärschlüssels auch den Index? 

SQL-Beispiele werden sehr geschätzt.

EDIT: Ein herzlicher Dank an alle, die sich fragen, warum es getan werden muss, anstatt Hilfe zu leisten. Um Ihre Frage zu beantworten, warum es getan werden muss: Ich befolge Anweisungen eines anderen, der sagt, ich müsste es so machen, und die Reihenfolge der Spalten macht eine Rolle. Meine Gedanken/Meinungen dazu sind irrelevant.

33
Ryan Rodemoyer

Schauen Sie sich das Paket DBMS_Redefinition an. Die Tabelle wird mit der neuen Reihenfolge neu erstellt. Es kann mit der Tabelle online gemacht werden. 

Denken Sie, wie Phil Brown bemerkt hat, sorgfältig darüber nach. Beim Scannen der Zeile nach Spalten und Verschieben von Daten bei der Aktualisierung besteht jedoch ein Aufwand. Spaltenreihenfolgenregeln, die ich verwende (in keiner bestimmten Reihenfolge):

  • Gruppieren Sie zusammengehörige Spalten.
  • Keine NULL-Spalten vor nullfähigen Spalten.
  • Häufig wurden nicht indizierte Spalten zuerst durchsucht.
  • Selten zuletzt gefüllte nullfähige Spalten.
  • Statische Spalten zuerst.
  • Aktualisierbare varchar-Spalten später.
  • Indizierte Spalten nach anderen durchsuchbaren Spalten.

Diese Regeln stehen in Konflikt und wurden nicht alle auf die neueste Version getestet. Die meisten wurden in der Praxis getestet, aber ich habe die Ergebnisse nicht dokumentiert. Platzierungsoptionen zielen auf eines von drei Zielkonflikten ab: leicht verständliche Spaltenplatzierung; schneller Datenabruf; und minimale Datenverschiebung bei Updates.

17
BillThor

Seit der Veröffentlichung von Oracle 12c ist es jetzt einfacher, Spalten logisch neu anzuordnen.

Oracle 12c fügte Unterstützung hinzu, um Spalten unsichtbar zu machen, und diese Funktion kann verwendet werden, um Spalten logisch neu anzuordnen.

Zitat aus der Dokumentation zu unsichtbaren Spalten :

Wenn Sie eine unsichtbare Spalte sichtbar machen, wird die Spalte als letzte Spalte in die Spaltenreihenfolge der Tabelle aufgenommen.

Beispiel

Erstellen Sie eine Tabelle:

CREATE TABLE t (
    a INT,
    b INT,
    d INT,
    e INT
);

Fügen Sie eine Spalte hinzu:

ALTER TABLE t ADD (c INT);

Bewegen Sie die Säule in die Mitte:

ALTER TABLE t MODIFY (d INVISIBLE, e INVISIBLE);
ALTER TABLE t MODIFY (d VISIBLE, e VISIBLE);

DESCRIBE t;

Name
----
A
B
C
D
E

Credits

Ich lernte dies von einem Artikel von Tom Kyte über neue Funktionen in Oracle 12c .

43
Jonas Meller

Es ist traurig, dass Oracle dies nicht zulässt. Ich werde ständig von Entwicklern dazu aufgefordert.

Hier ist eine etwas gefährliche, etwas schnelle und schmutzige Methode:

  1. Stellen Sie sicher, dass Sie genügend Platz zum Kopieren der Tabelle haben
  2. Beachten Sie Einschränkungen, Zuschüsse, Indizes, Synonyme, Auslöser, ähm ... vielleicht etwas anderes - das gehört zu einer Tabelle -, an das ich noch nicht gedacht habe?
  3. CREATE TABLE table_right_columns AS SELECT column1 column3, column2 FROM table_wrong_columns; -- Notice how we correct the position of the columns :)
  4. DROP TABLE table_wrong_columns;
  5. "ALTER TABLE table_right_columns RENAME TO table_wrong_columns;`
  6. Nun der glückliche Teil: Erstellen Sie alle Elemente neu, die Sie in Schritt 2 oben notiert haben
  7. Prüfen Sie, welcher Code jetzt ungültig ist, und kompilieren Sie ihn erneut, um nach Fehlern zu suchen

Und wenn Sie das nächste Mal eine Tabelle erstellen, berücksichtigen Sie bitte die zukünftigen Anforderungen! ;)

7
grokster

Verwenden Sie die Ansicht, um die Position der Spalte zu ändern: CREATE VIEW CORRECTED_POSITION AS SELECT co1_1, col_3, col_2 FROM UNORDERDED_POSITION .__ sollte helfen.

Diese Anforderungen werden gestellt, sodass einige Berichte erstellt werden, in denen SELECT * FROM [Tabellenname] verwendet wird. In manchen Unternehmen besteht ein hierarchischer Ansatz, die Informationen so zu platzieren, dass sie vom Back-End besser lesbar sind.

Danke Dilip

0
dilip