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:
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.
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):
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.
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.
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
J'ai appris cela de un article de Tom Kyte sur les nouvelles fonctionnalités d'Oracle 12c }.
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:
CREATE TABLE table_right_columns AS SELECT column1 column3, column2 FROM table_wrong_columns; -- Notice how we correct the position of the columns :)
DROP TABLE table_wrong_columns;
Et la prochaine fois que vous créez une table, veuillez prendre en compte les besoins futurs! ;)
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