web-dev-qa-db-fra.com

Réorganiser les colonnes de la table dans Oracle

J'ai une table avec plus de 50 colonnes et je dois échanger l'ordre des deux premières colonnes. Quel est le meilleur moyen d'accomplir cela avec Oracle? Supposons que le nom de la table est ORDERDETAILS et que, dans l'état actuel, les deux premières colonnes sont ITEM_ID et ORDER_ID. Une fois le changement de nom 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 colonne et le reste des colonnes et leur ordre est irréel.

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

  1. Renommez la table existante.
  2. Supprimez la contrainte de clé primaire.
  3. Recréez la table avec le bon ordre de colonnes.
  4. Élément de liste
  5. Exécutez INSERT INTO .. ​​SELECT pour déplacer les données de temp vers la table à l’étape 3.
  6. Supprimez la table temporaire.

J'ai peu d'expérience avec Oracle, alors il me manque peut-être une étape ou deux.

Une clé primaire implique-t-elle un index dans Oracle? La suppression de la clé primaire supprime-t-elle également l'index? 

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

EDIT: Un remerciement sincère à ceux qui se demandent pourquoi il faut le faire au lieu de l’aider. Pour répondre à votre question quant à la raison pour laquelle il faut le faire: 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 est important. Mes pensées/opinions à ce sujet ne sont pas pertinentes.

33
Ryan Rodemoyer

Regardez le paquet DBMS_Redefinition. Il reconstruira la table avec la nouvelle commande. Cela peut être fait avec la table en ligne. 

Comme Phil Brown l'a noté, réfléchissez bien avant de le faire. Cependant, l'analyse de la ligne pour les colonnes et le déplacement des données lors de la mise à jour sont fastidieux. Les règles de classement des colonnes que j'utilise (sans ordre particulier):

  • Regroupez les colonnes liées.
  • Pas les colonnes NULL avant les colonnes NULL.
  • Commencez par rechercher les colonnes non indexées fréquemment consultées.
  • Les colonnes nuls rarement remplies durent en dernier.
  • Colonnes statiques en premier.
  • Colonnes varchar pouvant être mises à jour ultérieurement.
  • Colonnes indexées après d'autres colonnes interrogeables.

Ces règles sont en conflit et les performances 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 ciblent l’un des trois objectifs en conflit: facilité de compréhension du placement des colonnes; récupération rapide des données; et mouvement minimal des données sur les mises à jour.

17
BillThor

Depuis la sortie d'Oracle 12c, il est maintenant plus facile de réorganiser les colonnes de manière logique.

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

Extrait de la documentation sur les colonnes invisibles :

Lorsque vous rendez une colonne invisible visible, la colonne est incluse dans l'ordre des colonnes de la table en tant que 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éplacez la colonne au 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

J'ai appris cela de un article de Tom Kyte sur les nouvelles fonctionnalités d'Oracle 12c }.

43
Jonas Meller

C'est triste qu'Oracle ne le permette pas, les développeurs me demandent tout le temps de le faire.

Voici une méthode légèrement dangereuse, un peu rapide et sale:

  1. Assurez-vous de disposer de suffisamment d'espace pour copier le tableau.
  2. Notez toutes les contraintes, subventions, index, synonymes, déclencheurs, euh… peut-être quelque chose d'autre - qui appartient à un tableau - auquel 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 RENAME TO table_wrong_columns; `
  6. Maintenant la partie dégueu: recréez tous les objets que vous avez notés à l'étape 2 ci-dessus
  7. Vérifiez quel code est maintenant invalide et recompilez pour vérifier les erreurs

Et la prochaine fois que vous créez une table, veuillez prendre en compte les besoins futurs! ;)

7
grokster

Utilisez la vue pour modifier la position de la colonne.

Ces demandes sont effectuées afin que certains rapports soient générés à l'aide de SELECT * FROM [nom_table]. Ou encore, certaines entreprises adoptent une approche hiérarchique consistant à placer les informations de manière à améliorer la lisibilité à partir du système principal.

Merci Dilip

0
dilip