Bonjour à tous,
voila, ma question va surement en choquer quelques-uns mais je veux en être sûr:
est-il possible d'avoir une clé primaire composée de plusieurs champs dont un qui pourrait être à null ???
Ou existe-t-il une alternative ???
Merci :o








Bonjour à tous,
voila, ma question va surement en choquer quelques-uns mais je veux en être sûr:
est-il possible d'avoir une clé primaire composée de plusieurs champs dont un qui pourrait être à null ???
Ou existe-t-il une alternative ???
Merci :o
Je ne vois qu'une seule réponse à vous faire : essayez donc, vous serez vite fixé et en plus, la réponse, vous vous en souviendrez ! ;-)








J'ai essayé mais comme je le disais, je voulais être sûr (que y'a pas moyen) !!!
Je déduis de votre réponse qu'il n'y a vraiment pas moyen...
Je cherche toujours une solution donc si qqun a une idée...
Merci !!!![]()
Déclarer une valeur par défaut pour ta colonne








Merci McM
Mais malheureusement, je dois avoir avoir NULL car (et j'aurais pu le préciser avant) ce champ est également une clé étrangère...
Et je ne peux pas créer de parent "fictif"...![]()
![]()
C'est pas bien compliqué de tester et d'être sûr !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 create table TOTO ( ID1 NUMBER, ID2 NUMBER, COL1 VARCHAR2(10) ); alter table TOTO add constraint PK_TOTO primary key (ID1, ID2);SQL> insert into toto (id1, id2, col1) values (1, 1, 'Ligne 1');
1 row created.
SQL> insert into toto (id1, id2, col1) values (1, 2, 'Ligne 2');
1 row created.
SQL> insert into toto (id1, id2, col1) values (1, NULL, 'Ligne 3');
insert into toto (id1, id2, col1) values (1, NULL, 'Ligne 3')
*
ERROR at line 1:
ORA-01400: cannot insert NULL into ("SCOTT"."TOTO"."ID2")








J'sais pas pourquoi vous êtes, je vous ai dis que j'ai essayé.
Désolé si je vous ai irrité mais permettez moi de douter de mes connaissances et de croire qu'il existe peut-être un truc du genreJ'ai essayé
Merci
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 alter table TOTO add constraint PK_TOTO primary key (ID1, ID2 ALLOW NULL);
Comme il est nécessaire de différencier chaque enregistrement de manière unique, une clé primaire (composé ou pas de plusieurs champs) ne peut pas être égale à null.
A ma connaissance (enfin elle est pas grande) , il n'y a pas de moyens de contourner ça.
En espérant t'avoir aidé.
La réponse est non, tous les champs de la PK doivent être NOT NULL.
je suppose que tu veux pouvoir insérer comme clé (PK1, PK2)
(1, 0) et (1, NULL)
mais qu'un deuxième (1, NULL) ne doit pas pouvoir être inséré
Tu peux créer un autre champ PK2b comme PK2
Tu y mets la valeur de PK2 et par défaut tu y mets -1. (Triggers préinsert, update)
Ta Primary Key sera (PK1, PK2b) NOT NULL donc
Code : Sélectionner tout - Visualiser dans une fenêtre à part PK2b := nvl(PK2, -1);
Ta clé étrangère sur PK2
Voila.
EDIT : la valeur par défaut -1 ne doit pas pouvoir être retrouvée dans la table de la clé étrangère. Donc faut trouver quelque chose qui n'existera jamais.
Avez-vous pensé à faire des clés uniques?
Une clé unique implique que les enregistrements soient uniques....quand ils ne sont pas nuls!
A mon avis, c'est exactement ce que vous recherchez
La définition "conceptuelle" d'une clé primaire est "unique et non nul".
Après, ça me semble difficile d'avoir une clé primaire nulle...








Oki, merci pour les précisions concernant la valeur nulle dans une clé primaire.
Merci McM pour l'idée du 2eme champ mais je vais plutot utiliser la contrainte d'unicité (plus facile à implémenter (merci Aline)).
Voila, merci encore à tout l'monde !!!![]()
Partager