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 :

[Oracle9i] Modification taille d'une colonne


Sujet :

Oracle

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    290
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 290
    Points : 137
    Points
    137
    Par défaut [Oracle9i] Modification taille d'une colonne
    Bonjour
    Je souhaite modifier la taille de certaines colonnes d'une table et plus précisemment les réduire. Ce n'est pas possible de les réduire même lorsqu'il y a des données dedans ? Je souhaite pourtant fortement les garder ...
    Pourrais-je éviter de faire qq chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    ALTER TABLE nom_table
    ADD (nom_colonne_temp VARCHAR2(9))
     
    UPDATE ENTREPRISE SET nom_colonne_temp=nom_colonne
     
    ALTER TABLE nom_table
    DROP COLUMN nom_colonne
     
    CREATE TABLE temporary (nom_colonne, col1, col2 ,...)
    AS SELECT nom_colonne_temp, col1, col2 ,... FROM nom_table;
     
    DROP TABLE nom_table;
     
    RENAME temporary TO nom_table;
     
    ALTER TABLE nom_table
    ADD CONSTRAINT nom_contrainte PRIMARY KEY (nom_colonne)
    Merci !

  2. #2
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    En 9i

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    SQL> CREATE TABLE TEST(ID VARCHAR2(50));
     
    Table crÚÚe.
     
    SQL> INSERT INTO TEST VALUES('0123456789');
     
    1 ligne crÚÚe.
     
    SQL> INSERT INTO TEST VALUES('0123456789');
     
    1 ligne crÚÚe.
     
    SQL> ALTER TABLE TEST MODIFY ID VARCHAR2(10);
     
    Table modifiÚe.
     
    SQL> describe TEST
     Nom                                       NULL ?   Type
     ----------------------------------------- -------- ----------------------------
     ID                                                 VARCHAR2(10)
     
    SQL> select * from TEST
      2  ;
     
    ID
    ----------
    0123456789
    0123456789
    Mais je pensais pas que ça marcherai ...
    Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    290
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 290
    Points : 137
    Points
    137
    Par défaut
    Eh ben mince alors effectivement cela fonctionne ici. Pourtant j'ai bien l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ORA-01440: column to be modified must be empty to decrease precision or scale
    Mais cette erreur ne se produit que pour la colonne suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ALTER TABLE SCOTT.TABLE
    	MODIFY (COL	NUMBER(37) )
    Pour les autres des char tout s'est bien passé ...

  4. #4
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    Et si tu fais exactement ce que j'ai fait ça donne quoi ? Il y a ptet une histoire de commits, de clés étrangères ou ce genre de choses.

    Déjà es-tu sur que les données que tu as dans ta colonne sont inférieure à la taille que tu essayes de lui fixer ?

    Quelle version de base ?
    Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    290
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 290
    Points : 137
    Points
    137
    Par défaut
    Citation Envoyé par nuke_y
    Déjà es-tu sur que les données que tu as dans ta colonne sont inférieure à la taille que tu essayes de lui fixer ?
    Je suis relativement sur puisque est immense.
    Précision : la colonne que je veux passer en Number est un float.

  6. #6
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    Houla attends c'est pas la même chose que ce que j'ai fait là. Pas du tout du tout.
    Le VARCHAR2 je pense que ça lui pose pas de problème car il gère le fait que la taille soit dynamique. Donc si tu n'as que des données qui ont 9 caractères dans une colonne qui peut en accepter 50, il ne considère que les 9 caractères et donc on peut réduire la colonne à 9.

    maintenant pour les numbers... arf !! Je regarde
    Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    290
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 290
    Points : 137
    Points
    137
    Par défaut
    A priori mon cas rentre bien dans l'ensemble des cas possibles :
    Citation Envoyé par www.developez.com
    Le type de la colonne peut être modifié si toutes les lignes ont une valeur NULL, où si le nouveau type défini ne remet pas en cause les données existantes dans la colonne.
    Vous pouvez modifier une colonne de type DATE en TIMESTAMP ou TIMESTAMP WITH LOCAL TIME ZONE.
    Vous pouvez modifier une colonne de type TIMESTAMP WITH LOCAL TIME ZONE en DATE (mais les fractions de seconde et le décalage horaire sont perdus).
    Vous pouvez modifier une colonne de type LONG en CLOB ou NCLOB et une colonne de type LONG RAW en BLOB.
    Le seul type de contrainte applicable avec la clause MODIFY est NOT NULL, si aucune ligne de la table ne contient de NULL.
    Pour définir de nouvelle contraintes (UNIQUE, PRIMARY KEY, REFERENCES, CHECK)sur une colonne existante, utilisez la clause add_column_clause.
    Pour modifier une contrainte existante sur la colonne, utilisez la clause constraint_clauses.

    Restrictions liées à la modification de colonnes

    * Vous ne pouvez pas modifier une colonne si un index de domaine y est défini. Vous devez préalablement supprimer cet index
    * Vous ne pouvez pas définir une colonne de type ROWID sur une IOT (par contre vous pouvez la définir de type UROWID)
    * Vous ne pouvez pas modifier le type d'une colonne REF

  8. #8
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    SQL> CREATE TABLE TEST(ID float);
     
    Table crÚÚe.
     
    SQL> INSERT INTO TEST VALUES(123.45678);
     
    1 ligne crÚÚe.
     
    SQL> INSERT INTO TEST VALUES(0.12345678);
     
    1 ligne crÚÚe.
     
    SQL> select * from TEST;
     
            ID
    ----------
     123,45678
     ,12345678
     
    SQL> ALTER TABLE TEST MODIFY ID NUMBER(38);
    ALTER TABLE TEST MODIFY ID NUMBER(38)
                            *
    ERREUR Ó la ligne 1 :
    ORA-01440: column to be modified must be empty to decrease precision or scale
     
    SQL> UPDATE TEST SET ID = TRUNC(ID);
     
    2 ligne(s) mise(s) Ó jour.
     
    SQL> ALTER TABLE TEST MODIFY ID NUMBER(38);
    ALTER TABLE TEST MODIFY ID NUMBER(38)
                            *
    ERREUR Ó la ligne 1 :
    ORA-01440: column to be modified must be empty to decrease precision or scale
    Donc ça ne marche pas. Solution de contournement sans passer par une table intermédiaire mais une colonne intermédiaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    SQL> ALTER TABLE TEST ADD ID_TEMP NUMBER(38);
     
    Table modifiÚe.
     
    SQL> UPDATE TEST SET ID_TEMP = ID;
     
    2 ligne(s) mise(s) Ó jour.
     
    SQL> ALTER TABLE TEST DROP COLUMN ID;
     
    Table modifiÚe.
     
    SQL> ALTER TABLE TEST ADD ID NUMBER(38);
     
    Table modifiÚe.
     
    SQL> UPDATE TEST SET ID = ID_TEMP;
     
    2 ligne(s) mise(s) Ó jour.
     
    SQL> ALTER TABLE TEST DROP COLUMN ID_TEMP;
     
    Table modifiÚe.
     
    SQL> SELECT * FROM TEST;
     
            ID
    ----------
           123
             0
     
    SQL> describe TEST
     Nom                                       NULL ?   Type
     ----------------------------------------- -------- ----------------------------
     ID                                                 NUMBER(38)
    Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes.

  9. #9
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    où si le nouveau type défini ne remet pas en cause les données existantes dans la colonne.
    Ben toi ça les remet en cause puisque tu risques de perdre des décimales non ?
    Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes.

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    290
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 290
    Points : 137
    Points
    137
    Par défaut
    Ok ben cela fonctionne impécable. C'est étrange que dans ce sens on ne peut pas faire de modifications de type même si l'ensemble des données est compatible.

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    290
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 290
    Points : 137
    Points
    137
    Par défaut
    Citation Envoyé par nuke_y
    où si le nouveau type défini ne remet pas en cause les données existantes dans la colonne.
    Ben toi ça les remet en cause puisque tu risques de perdre des décimales non ?
    Ben je ne perd pas de décimale puisqu'il n'y en a pas ...

  12. #12
    Rédacteur

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 320
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 320
    Points : 3 798
    Points
    3 798
    Par défaut
    Une autre solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    SQL> CREATE TABLE TEST(ID float); 
     
    Table créée.
     
    SQL> INSERT INTO TEST VALUES(123.45678); 
     
    1 ligne créée.
     
    SQL> INSERT INTO TEST VALUES(0.12345678); 
     
    1 ligne créée.
     
    SQL> commit ;
     
    Validation effectuée.
     
    SQL> create table test2 (ID number ) ; 
     
    Table créée.
     
    SQL> select * from test ;
     
            ID
    ----------
     123,45678
     ,12345678
     
    SQL> insert into test2 select * from test ;
     
    2 ligne(s) créée(s).
     
    SQL> commit ;
     
    Validation effectuée.
     
    SQL> select * from test2 ;
     
            ID
    ----------
     123,45678
     ,12345678
     
    SQL> drop table test ;
     
    Table supprimée.
     
     
    SQL> rename test2 to test ;
     
    Table renommée.
     
    SQL> select * from test ;
     
            ID
    ----------
     123,45678
     ,12345678
    Cependant cette solution présente quelques inconvénients :

    - Oracle transfére automatiquement les indexs , les priviléges lors du renammage , mais auparavant il faut les recréer
    - cela invalide les vues , les triggers ...
    - cela oblide a re créer les indexs

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    c'est pas plus simple en ajoutant une colonne tout simplement ?

  14. #14
    Rédacteur

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 320
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 320
    Points : 3 798
    Points
    3 798
    Par défaut
    Citation Envoyé par orafrance
    c'est pas plus simple en ajoutant une colonne tout simplement ?
    POurquoi faire ultra simple quand on peut faire trés compliqué

  15. #15
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    Excepté qu'il faut peut-être modifier tout un tas de choses, choses pour lesquelles que ce soit un float ou un number est transparent.
    Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes.

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

Discussions similaires

  1. Fixer la taille d'une colonne
    Par steps5ive dans le forum Access
    Réponses: 2
    Dernier message: 25/05/2006, 20h54
  2. [C#] Modifier la taille d'une colonne dans un datagrid
    Par Sylk dans le forum Windows Forms
    Réponses: 2
    Dernier message: 19/01/2006, 18h27
  3. Récupérer le type et la taille d'une colonne
    Par Progs dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 23/09/2005, 17h27
  4. Réponses: 12
    Dernier message: 11/04/2005, 18h31
  5. [JTable] ajuster la taille d'une colonne à la taille du texte
    Par GETah dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 24/02/2005, 11h53

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