Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 29/09/2008, 14h04   #1
Membre actif
 
Inscription : avril 2007
Messages : 483
Détails du profil
Informations personnelles :
Âge : 24

Informations forums :
Inscription : avril 2007
Messages : 483
Points : 189
Points : 189
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 :
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
Sh4dow49 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/09/2008, 14h21   #2
Membre actif
 
Inscription : avril 2007
Messages : 483
Détails du profil
Informations personnelles :
Âge : 24

Informations forums :
Inscription : avril 2007
Messages : 483
Points : 189
Points : 189
j'ai fait :
Code :
ALTER TABLE matable DROP PRIMARY KEY;

et ensuite :
Code :
ALTER TABLE matable ADD CONTRAINT nomcontrainte PRIMARY KEY(id);
Voila.
Sh4dow49 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/09/2008, 18h57   #3
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 695
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 695
Points : 10 452
Points : 10 452
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
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 :
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.
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/09/2008, 17h19   #4
Membre Expert
 
Avatar de scheu
 
Inscription : juin 2007
Messages : 1 497
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 1 497
Points : 1 485
Points : 1 485
Citation:
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/
scheu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/09/2008, 18h28   #5
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 320
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
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 : 3 320
Points : 5 839
Points : 5 839
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 :
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
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/09/2008, 18h37   #6
Expert Confirmé
 
Avatar de 7gyY9w1ZY6ySRgPeaefZ
 
Homme
dba
Inscription : juillet 2007
Messages : 2 523
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : dba

Informations forums :
Inscription : juillet 2007
Messages : 2 523
Points : 3 975
Points : 3 975
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 :
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.
__________________
les règles du forum - mode d'emploi du forum
Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs.
(Rappel : "ça ne marche pas" n'est pas un message d'erreur)
JE NE RÉPONDS PAS aux questions techniques par message privé.
Écrire en français sur un forum est une marque minimale de respect.
7gyY9w1ZY6ySRgPeaefZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/09/2008, 19h33   #7
Rédacteur/Modérateur
 
Avatar de Vincent Rogier
 
vincent rogier
Inscription : juillet 2007
Messages : 2 355
Détails du profil
Informations personnelles :
Nom : vincent rogier
Âge : 34

Informations forums :
Inscription : juillet 2007
Messages : 2 355
Points : 3 108
Points : 3 108
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 :
Citation:
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
Vincent Rogier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/09/2008, 21h02   #8
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 320
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
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 : 3 320
Points : 5 839
Points : 5 839
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.
Citation:
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.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/09/2008, 21h07   #9
Rédacteur/Modérateur
 
Avatar de Vincent Rogier
 
vincent rogier
Inscription : juillet 2007
Messages : 2 355
Détails du profil
Informations personnelles :
Nom : vincent rogier
Âge : 34

Informations forums :
Inscription : juillet 2007
Messages : 2 355
Points : 3 108
Points : 3 108
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
Vincent Rogier est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h46.


 
 
 
 
Partenaires

Hébergement Web