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

SQL Oracle Discussion :

Modifier la clé primaire (et non sa valeur)


Sujet :

SQL Oracle

  1. #1
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    483
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Avril 2007
    Messages : 483
    Points : 234
    Points
    234
    Par défaut Modifier la clé primaire (et non sa valeur)
    Bonjour,

    Tout d'abord désolé si je ne suis pas au bon endroit pour poster, je ne savais pas trop quelle catégorie mon problème touche j'ai donc posté dans le général.

    Voila je suis en train de créer un petit module supplémentaire à une appli que j'avais développé, et j'ai besoin d'ajouter une table.

    Cependant la clé primaire de la table à laquelle je dois la lier ne me convient pas, elle est construite sur trois champs, je voudrais la réduire pour qu'elle ne soit plus que sur un champ (juste le champ id).

    J'ai essayé des trucs du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ALTER TABLE ma_table MODIFY PRIMARY KEY(Id);
    (syntaxe trouvée sur internet) mais ça ne marche pas et je ne trouve rien de mieux ...

    Est-ce possible directement ou bien dois-je passer par la suppression de la contrainte pour la recréer ensuite ? (comment faire dans le deuxième cas ? car je ne trouve pas non plus la syntaxe exacte)


    Merci d'avance pour votre aide

  2. #2
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    483
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Avril 2007
    Messages : 483
    Points : 234
    Points
    234
    Par défaut
    j'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ALTER TABLE matable DROP PRIMARY KEY;

    et ensuite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ALTER TABLE matable ADD CONTRAINT nomcontrainte PRIMARY KEY(id);
    Voila.

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Une petite précision toutefois, lors de la génération d'une clef primaire Oracle constituera obligatoirement un index associé.

    Si aucun paramètre n'est défini, cet index ira se loger dans le tablespace par défaut, ce qui n'est pas toujours opportun.

    Vous pouvez utiliser le code suivant pour le diriger au bon endroit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ALTER TABLE matable ADD CONSTRAINT PK_nomcontrainte
    PRIMARY KEY ( id )
    USING INDEX TABLESPACE tablespace_idx;
    De même, préfixer ou suffixer ses indexes est une bonne pratique.

  4. #4
    Membre expérimenté Avatar de scheu
    Inscrit en
    Juin 2007
    Messages
    1 506
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 1 506
    Points : 1 734
    Points
    1 734
    Par défaut
    Une petite précision toutefois, lors de la génération d'une clef primaire Oracle constituera obligatoirement un index associé.
    C'est aussi le cas pour les contraintes d'unicité
    La théorie, c'est quand on sait tout mais que rien ne fonctionne.
    La pratique, c'est quand tout fonctionne mais que personne ne sait pourquoi.
    Ici, nous avons réuni théorie et pratique : Rien ne fonctionne ... et personne ne sait pourquoi !

    Réplication de base avec Postgresql : http://scheu.developpez.com/tutoriel.../log-shipping/

  5. #5
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Une petite précision toutefois, lors de la génération d'une clef primaire Oracle constituera obligatoirement un index associé.
    ...
    Est vous certain ?
    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
     
    SQL> create table emp1 as select * from emp;
     
    Table crÚÚe.
     
    SQL> create unique index ix_emp1 on emp1(empno);
     
    Index crÚÚ.
     
    SQL> alter table emp1
      2  add constraint pk_emp1 primary key (empno);
     
    Table modifiÚe.
    SQL> r
      1  select index_name
      2  from user_indexes
      3* where table_name = 'EMP1'
     
    INDEX_NAME
    ------------------------------
    IX_EMP1

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Êtes-vous certain ?
    Effectivement, j'ai constaté ça aussi.
    C'est à la création de la table que l'index de la clef primaire est créé, d'après mon test en 10g...
    Mince alors...

    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
    12:39:04 BD> CREATE TABLE AAAAAAAAAAA (
    12:39:04   2      ID      NUMBER NOT NULL,
    12:39:04   3      COLUMN1 VARCHAR2(20)   ,
    12:39:04   4      CONSTRAINT AAAAAAAAAAA_PK PRIMARY KEY ( ID ) ENABLE
    12:39:04   5    ) ;
     
    Table créée.
     
    12:39:05 BD>   SELECT index_name FROM user_indexes WHERE table_name = 'AAAAAAAAAAA';
     
    INDEX_NAME
    ------------------------------
    AAAAAAAAAAA_PK
     
    1 ligne sélectionnée.
    Dernière modification par Invité ; 30/09/2008 à 18h55.

  7. #7
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 307
    Points
    5 307
    Par défaut
    Une clé primaire a obligatoirement besoin d'un index.

    Lors de l'ajout d'une clé primaire sur une table qui possède déjà un index sont les caractéristiques correspondent à celles requises par une clé primaire (valeur unique + même colonne), pourquoi Oracle irait récréer un nouvel index et donc gaspiller de la place pour rien et faire deux fois le boulot de vérification à chaque DML référençant la clé ?

    Donc, pour peaufiner ce que dit Waldar, je dirais plutôt :
    Une petite précision toutefois, lors de la génération d'une clef primaire Oracle constituera obligatoirement un index associé si un index de même nature n'existe pas pour la table en question
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  8. #8
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par vicenzo Voir le message
    Une clé primaire a obligatoirement besoin d'un index.

    Lors de l'ajout d'une clé primaire sur une table qui possède déjà un index sont les caractéristiques correspondent à celles requises par une clé primaire (valeur unique + même colonne), pourquoi Oracle irait récréer un nouvel index et donc gaspiller de la place pour rien et faire deux fois le boulot de vérification à chaque DML référençant la clé ?

    Donc, pour peaufiner ce que dit Waldar, je dirais plutôt :
    Et lire la doc aussi.
    PRIMARY KEY Constraints and Indexes
    Oracle enforces all PRIMARY KEY constraints using indexes. In Figure 21-5, the primary key constraint created for the deptno column is enforced by the implicit creation of:

    A unique index on that column

    A NOT NULL constraint for that column

    Composite primary key constraints are limited to 32 columns, which is the same limitation imposed on composite indexes. The name of the index is the same as the name of the constraint. Also, you can specify the storage options for the index by including the ENABLE clause in the CREATE TABLE or ALTER TABLE statement used to create the constraint. If a usable index exists when a primary key constraint is created, then the primary key constraint uses that index rather than implicitly creating a new one.

  9. #9
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 307
    Points
    5 307
    Par défaut
    belle paraphrase ! ...

    Mais c'est effectivement un bonne idée que de lire les docs....
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

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

Discussions similaires

  1. Clés primaires multiples non autorisées ?
    Par ctobini dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 15/02/2007, 15h16
  2. Réponses: 10
    Dernier message: 11/01/2007, 10h22
  3. supprimer ou modifier un clé primaire
    Par tahir dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 06/10/2006, 08h01
  4. Select list me donne l'index et non la valeur
    Par beegees dans le forum ASP
    Réponses: 3
    Dernier message: 07/09/2006, 09h21
  5. Modifier la surface primaire (avec un filtre)
    Par cemoi dans le forum DirectX
    Réponses: 56
    Dernier message: 01/01/2004, 20h48

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