Colonnes de nouvel ordre du tableau dans Oracle

j'ai une table avec 50+ colonnes et j'ai besoin d'inverser l'ordre des deux premières colonnes. Quelle est la meilleure façon d'accomplir ceci en utilisant Oracle? Supposons que le nom de la table est ORDERDETAILS et comme il est, les deux premières colonnes sont ITEM_ID et ORDER_ID. Une fois le renommage terminé, le nom de la table doit toujours être ORDERDETAILS mais les deux premières colonnes seront ORDER_ID et ITEM_ID. FWIW, les types de colonnes et le reste des colonnes et leur ordre est irelevent.

corrigez - moi si je me trompe, mais je pense que les étapes générales sont:

  1. Renommer la table existante.
  2. supprimer la contrainte principale.
  3. recréer la table avec l'ordre correct de la colonne.
  4. élément de la Liste
  5. Run INSERT INTO .. Sélectionnez pour déplacer les données de temp à la table de l'étape #3.
  6. laissez tomber la table des intérimaires.

j'ai peu d'expérience avec Oracle donc peut-être que je manque une étape ou deux.

une clé primaire sous-entendre un index dans Oracle? La suppression de la touche primaire fait-elle aussi chuter l'indice?

les exemples SQL sont très appréciés.

EDIT: un sincère merci à ceux qui posent la question de pourquoi il doit faire au lieu de fournir de l'aide. Pour répondre à votre question quant à la raison pour laquelle il doit être fait: je suis les ordres de quelqu'un d'autre qui dit que je dois le faire de cette façon et l'ordre des colonnes ne compte pas. Mes pensées / opinions à ce sujet sont irrelevent.

29
demandé sur Ryan Rodemoyer 2011-02-09 02:32:31

4 réponses

regardez le paquet DBMS_Redefinition. Il va reconstruire la table avec le nouvel ordre. Il peut être fait avec la table en ligne.

comme Phil Brown l'a noté, réfléchissez bien avant de faire cela. Cependant, il y a des frais généraux dans le balayage de la ligne pour les colonnes et le déplacement des données sur la mise à jour. Règles d'ordre de colonne que j'utilise (dans aucun ordre particulier):

  • groupez les colonnes reliées ensemble.
  • not NULL colonnes avant null-mesure colonnes.
  • fréquemment recherche dans les colonnes non indexées en premier.
  • rarement rempli les colonnes null-able last.
  • colonnes statiques d'abord.
  • mise à Jour des colonnes varchar plus tard.
  • colonnes indexées après les autres colonnes consultables.

ces règles entrent en conflit et n'ont pas toutes été testées sur la dernière version. La plupart ont été testés dans la pratique, mais je n'ai pas documenté les résultats. Les options de Placement visent l'un des trois objectifs conflictuels suivants: comprendre le placement des colonnes; la récupération rapide des données; et le mouvement minimal des données sur les mises à jour.

17
répondu BillThor 2011-02-09 00:16:06

depuis la sortie D'Oracle 12c, il est maintenant plus facile de réorganiser logiquement les colonnes.

Oracle 12c a ajouté le support pour rendre les colonnes invisibles et cette fonctionnalité peut être utilisée pour réorganiser les colonnes logiquement.

citation tirée du documentation sur les colonnes invisibles:

quand vous faites une colonne invisible visible, la colonne est incluse dans l'ordre de la colonne de la table comme la dernière colonne.

Exemple

Créer une table:

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

Ajouter une colonne:

ALTER TABLE t ADD (c INT);

Déplacer la colonne vers le milieu:

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

DESCRIBE t;

Name
----
A
B
C
D
E

Crédits

je l'ai appris à partir d' un article de Tom Kyte sur les nouvelles fonctionnalités D'Oracle 12c.

35
répondu Jonas Meller 2015-04-30 17:41:03

c'est triste Qu'Oracle ne permette pas cela, on me demande de le faire par des développeurs tout le temps..

  1. assurez-vous d'avoir assez d'espace pour copier la Table
  2. Notez toutes les contraintes, les subventions, les index, les synonymes, les déclencheurs, hum.. peut - être d'autres choses - qui appartiennent à une Table-auxquelles je n'ai pas pensé?
  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 renommer en table_wrong_columns;'
  6. maintenant la partie yucky: recréer tous les éléments que vous avez noté dans l'étape 2 ci-dessus
  7. vérifier quel code est maintenant invalide, et recompiler pour vérifier les erreurs

et la prochaine fois que vous créez une table, s'il vous plaît considérer les exigences futures! ;)

7
répondu grokster 2016-12-05 19:49:10

utilisez la vue pour vos efforts en modifiant la position de la colonne: CRÉER UNE VUE CORRECTED_POSITION COMME Sélectionnez co1_1, col_3, col_2 DE UNORDERDED_POSITION devrait aider.

ces requêtes sont faites de sorte que certains rapports soient produits là où ils utilisent SELECT * de [table_name]. Ou encore, certaines entreprises ont adopté une approche hiérarchique consistant à placer l'information de manière à en améliorer la lisibilité à partir de la fin.

Merci Dilip

-1
répondu dilip 2015-05-08 14:36:49