IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Oracle Discussion :

Ajout de colonnes en début de table ?


Sujet :

Oracle

  1. #1
    Membre émérite

    Inscrit en
    Décembre 2004
    Messages
    584
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 584
    Par défaut Ajout de colonnes en début de table ?
    Bonjour

    J'aurai besoin d'ajouter 3 colonnes en début de table.

    Pour l'instant, je fais un simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ALTER TABLE TABLE_NAME
    ADD     (
            COL_DATE    DATE,
            COL_TEXTE1    VARCHAR2(64),
            COL_TEXTE2    VARCHAR2(64),
            )
    Vous seriez comment faire pour que ces colonnes soient ajoutées en début de table et non à la fin ? En effet, un programme qui utilise ses tables accèdes les colonnes par leur numéro, et mes colonnes sont sensées être au début...

    Pour info, je suis en Oracle 9ir2.

    Merci d'avance
    ZedroS

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Par défaut
    Je ne crois pas que c'est possible. L'ordre des colonnes dans une table n'est pas configurable. Il faut modifier les requêtes concernées en conséquence.

  3. #3
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    pourquoi l'ordre est-il important ?

  4. #4
    Membre émérite

    Inscrit en
    Décembre 2004
    Messages
    584
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 584
    Par défaut
    L'ordre est important car un programme sur lequel je n'ai pas la main cherche des info par leur numéro de colonne, or la 2eme colonne que je rajoute est, normalement, en 2eme position.

    Du coup quand le programme fait "chercherValeurParNumCol(2)", il se trouve avec autre chose que le contenu attendu.

    Ceci dit, si c'est tout simplement pas possible je vais chercher autre chose...

  5. #5
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    La seule façon c'est de recréer la table.

  6. #6
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    ou peut-être de passer par une vue.

  7. #7
    Membre émérite

    Inscrit en
    Décembre 2004
    Messages
    584
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 584
    Par défaut
    Ok, va pour la recréation de la table. Moi qui pensait qu'il y aurait plus simple

    Merci tout de même !

    ++
    ZedroS

  8. #8
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Citation Envoyé par plaineR
    ou peut-être de passer par une vue.

    +1 vue et synonyme ça parait pas mal

  9. #9
    Membre émérite

    Inscrit en
    Décembre 2004
    Messages
    584
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 584
    Par défaut
    Citation Envoyé par Fred_D
    +1 vue et synonyme ça parait pas mal
    Ouarf, juste une table temporaire et un CREATE TABLE GNAGNA AS SELECT ... ça passe bien aussi ^^

  10. #10
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    si c'est simple oui, mais gare aux indexes, contraintes, synonymes, privilèges, etc... qui ne suivent pas lors d'un CREATE AS SELECT

  11. #11
    Membre Expert
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Par défaut
    Tu peux peut etre aller bidouiller la table COL$ puis redémarrer la base, je l'ai fait pas mal de fois sans problème... (mais en 8i)

    tu peux même te passer du redémarrage de base en faisant un:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ALTER SYSTEM FLUSH SHARED_POOL
    cependant, ce n'est pas vraiment propre...

    si tu as toad, tu peux faire générer un script qui te fabrique une nouvelle table et te transfère les anciennes données dedans tout en jouant avec les "rename". C'est avec la fonction "rebuild" il me semble.

    Une fois que tu as ce script tu peux le modifier à ta guise pour placer les colonnes au bon endroit.

    Petite leçon de morale gratuite :
    Normalement, dans un monde parfait l'ordre des colonnes ne devrait avoir aucune importance vu que le "select *" est interdit...

  12. #12
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Citation Envoyé par remi4444
    Tu peux peut etre aller bidouiller la table COL$ puis redémarrer la base, je l'ai fait pas mal de fois sans problème... (mais en 8i)
    C'est quand même pas super conseillé

    Citation Envoyé par remi4444
    Normalement, dans un monde parfait l'ordre des colonnes ne devrait avoir aucune importance
    c'est clair

  13. #13
    Expert Oracle confirmé

    Homme Profil pro
    Consultant Big Data
    Inscrit en
    Mars 2003
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Consultant Big Data
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2003
    Messages : 448
    Par défaut
    Bonjour,

    Pour info, il est possible d'ajouter des colonnes à une table en spécifiant leur ordre. Pour cela, il faut utiliser le package DBMS_REDEFINITION, ce qui évite d'aller bidouiller dans les tables système (genre COL$).

    Je vous joins un petit exemple, et vous exorte à faire de nombreux tests, car ce package n'est pas facile à saisir.

    Je commence par créer une table ESSAI avec 2 colonnes NUM1 et NUM2 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    create table essai (num1 number not null primary key, num2 number not null) ;
     
    begin
      for i in 1..1000 loop
        insert into essai values (i, i) ;
      end loop ;
      commit ;  
    end ;
    /
    Ensuite je créée une table ESSAI2, qui constitue la nouvelle définition, avec une colonne NUM3 en 2 ième position, et j'appelle la procédure CAN_REDEF_TABLE sur ESSAI. Si cette procédure ne lance pas d'erreur, c'est que la table peut-être redéfinie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    create table essai2 (num1 number not null primary key, num3 number, num2 number) ;
     
    exec dbms_redefinition.can_redef_table (user, 'ESSAI') ;
    Au passage, je note les noms des index unique créés par les PK :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select table_name, index_name from user_indexes where table_name like 'ESSAI%' ;
     
    TABLE_NAME	INDEX_NAME
    ESSAI	SYS_C00288846
    ESSAI2	SYS_C00288848
    Et puis je lance la modification de la structure de la table ESSAI. Noter la syntaxe du mapping ('num1, 0 num3, num2') dans l'appel de START_REDEF_TABLE, où j'ai mis un 0 comme valeur par défaut pour la nouvelle colonne NUM3 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    exec dbms_redefinition.start_redef_table (user, 'ESSAI', 'ESSAI2', 'num1, 0 num3, num2') ;
    exec dbms_redefinition.finish_redef_table( user, 'ESSAI', 'ESSAI2');
    Voilà, c'est fini. Mais si je regarde les index, on s'aperçoit que les index ont changé de table !!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select table_name, index_name from user_indexes where table_name like 'ESSAI%' ;
    TABLE_NAME	INDEX_NAME
    ESSAI2	SYS_C00288846
    ESSAI	SYS_C00288848
    C'est pour cela que je préconise de faire des tests, surtout si il y a d'autres contraintes et des triggers sur la table.

    En fait, c'était mon premier essai, mais j'ai l'impression que DBMS_REDEFINITION ne fait rien d'autre que de peupler la table de redéfinition (ESSAI2) avec les données de la table d'origine (ESSAI), puis de renommer les 2 tables (ESSAI en ESSAI2 et vice versa). C'est pour cela que les index changent.

  14. #14
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    encore une très belle réponse



    As-tu essayé de rebuilder les indexes pour voir si Oracle retrouve ses petits ?

  15. #15
    Membre émérite

    Inscrit en
    Décembre 2004
    Messages
    584
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 584
    Par défaut
    Hum, cela dépasse mon niveau en Oracle, d'autant plus que je n'ai pas un compte avec plein de droits...

    Donc non je n'ai pas essayer de reconstruire les indexes, je ne saurai pasle faire et combien même je ne pense pas avoir les droits (en effet, je n'ai même pas les droits pour créer une séquence, alors...).

    Désolé

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2000] Ajouter une colonne de données à une table via vrai faux
    Par AmaAna dans le forum Modélisation
    Réponses: 1
    Dernier message: 17/05/2011, 16h46
  2. Réponses: 5
    Dernier message: 16/06/2006, 22h39
  3. Modification table : ajout de colonne puis insertion data
    Par nkongolo.m dans le forum Langage SQL
    Réponses: 2
    Dernier message: 16/06/2006, 19h37
  4. Réponses: 4
    Dernier message: 17/05/2006, 09h21
  5. prob ajout de colonne ds une table en tant NOT NULL
    Par elhosni dans le forum Access
    Réponses: 3
    Dernier message: 19/11/2005, 22h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo