web-dev-qa-db-fra.com

Comment insérer une colonne dans une position spécifique dans Oracle sans supprimer et recréer la table?

J'ai un scénario spécifique où je dois insérer deux nouvelles colonnes dans une table existante dans Oracle. Je ne peux pas laisser tomber et recréer la table. Alors peut-il être atteint par tous les moyens?

19
Amit

Amit-

Je ne crois pas que vous puissiez ajouter une colonne n'importe où, mais à la fin du tableau une fois le tableau créé. Une solution pourrait être d'essayer ceci:

CREATE TABLE MY_TEMP_TABLE AS
SELECT *
FROM TABLE_TO_CHANGE;

Supprimez la table à laquelle vous souhaitez ajouter des colonnes:

DROP TABLE TABLE_TO_CHANGE;

C'est au moment où vous pouvez reconstruire la table existante à partir de zéro en ajoutant dans les colonnes où vous le souhaitez .. .. Supposons pour cet exercice que vous souhaitez ajouter les colonnes nommées "COL2 et COL3".

Maintenant, insérez les données dans la nouvelle table: 

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

Lorsque les données sont insérées dans votre "nouvelle-ancienne" table, vous pouvez supprimer la table temporaire.

DROP TABLE MY_TEMP_TABLE;

C'est souvent ce que je fais lorsque je veux ajouter des colonnes à un emplacement spécifique. Évidemment, s’il s’agit d’un système de production en ligne, ce n’est probablement pas pratique, mais une idée potentielle.

-CJ

17
CJ Travis

Vous (toujours) ne pouvez pas choisir la position de la colonne avec ALTER TABLE: elle ne peut être ajoutée qu’à la fin du tableau. Vous pouvez évidemment sélectionner les colonnes dans l'ordre de votre choix. Par conséquent, si vous n'utilisez pas SELECT * FROM, l'ordre des colonnes ne devrait pas être un gros problème.

Si vous devez vraiment les avoir dans un ordre particulier et que vous ne pouvez pas supprimer et recréer la table, vous pourrez peut-être supprimer et recréer des colonnes à la place: -

D'abord copier le tableau

CREATE TABLE my_tab_temp AS SELECT * FROM my_tab;

Ensuite, déposez les colonnes que vous voulez être après la colonne que vous allez insérer

ALTER TABLE my_tab DROP COLUMN three;

Ajoutez maintenant la nouvelle colonne (deux dans cet exemple) et celles que vous avez supprimées.

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

Enfin ajouter les données pour les colonnes recréées

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

Évidemment, votre mise à jour sera probablement plus complexe et vous devrez gérer des index et des contraintes et ne pourrez pas l'utiliser dans certains cas (colonnes LOB, etc.). De plus, c’est une façon assez hideuse de le faire, mais le tableau existera toujours et vous obtiendrez les colonnes dans l’ordre que vous souhaitez. Mais est-ce que l'ordre des colonnes est vraiment important?

5
Lunc

Bien que ce soit un peu vieux, je voudrais ajouter une version légèrement améliorée qui change vraiment l’ordre des colonnes. Voici les étapes (en supposant que nous ayons une table TAB1 avec les colonnes COL1, COL2, COL3):

  1. Ajouter une nouvelle colonne à la table TAB1:
alter table TAB1 add (NEW_COL number);
  1. "Copier" la table dans nom temporaire en modifiant l'ordre des colonnes ET en renommant la nouvelle colonne:
create table tempTAB1 as select NEW_COL as COL0, COL1, COL2, COL3 from TAB1;
  1. supprimer la table existante:
drop table TAB1;
  1. renommer nomtable temporaire en simplement supprimé nomtable:
rename tempTAB1 to TAB1;
5
Gerd

En 12c, vous pouvez utiliser le fait que les colonnes définies de invisible à visible sont affichées en tant que dernière colonne du tableau: Trucs et astuces: Colonnes invisibles dans Oracle Database 12c

C’est peut-être le «truc» dont parlait @ Jeffrey-Kemp dans son commentaire, mais le lien ne fonctionne plus.

Exemple:

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
);

Maintenant, col_3 serait affiché en premier dans une instruction SELECT * FROM my_tab.

Remarque: cela ne modifie pas l'ordre physique des colonnes sur le disque, mais dans la plupart des cas, ce n'est pas ce que vous voulez faire. Si vous voulez vraiment changer l'ordre physique, vous pouvez utiliser le package DBMS_REDEFINITION.

0
dr fu manchu