Comment avoir une clé primaire combinaison qui peut contenir de valeurs null?
J'ai deux tables A et B telles que définies ci-dessous.
create table A
(
A_1 varchar2(10) NOT NULL,
A_2 varchar2(10),
A_3 varchar2(10),
constraint A_PK primary key (A_1,A_2)
)
TABLE A DATA
A_1 |A_2 |A_3
1111 abc some_text1
1111 null some_text1
1112 abc some_text2
1113 def some_text3
create table B
(
B_1 varchar2(10) NOT NULL,
B_2 varchar2(10),
B_3 varchar2(10),
constraint B_PK primary key (B_1,B_2,B_3),
constraint B_FK foreign key (B_1,B2) references A(A_1,A_2)
)
TABLE B DATA
B_1 | B_2 |B_3
1111 abc text1
1111 null text2
1111 null text3
1111 null text4
A_2 colonne dans Une table peut parfois être nul, mais la combinaison de A_1 et A_2 est toujours unique. J'ai besoin de A_2 faire partie de la clé primaire car alors seulement je peux de référence A_1 et A_2 comme des clés étrangères dans la table B. Problème ici, c'est la clé primaire ne peut pas être null. Comment résoudre ce problème?
Toute réponse sera très appréciée
Vous devez vous connecter pour publier un commentaire.
Vous résoudre ce problème en n'ayant pas cela comme une clé primaire. Les clés primaires ne peuvent pas être
NULL
ou, s'ils en sont les clés primaires composites, ne peut pas contenir deNULL
. Faire un index unique à la place. Créer un champ de type numéroauto pour la clé primaire.Vous ne pouvez pas avoir une valeur null dans la colonne de clé primaire, mais vous pouvez créer un index Unique avec null colonnes. Pour obtenir que cela fonctionne dans Oracle 10g, j'ai également eu à ajouter explicitement une unique contrainte sur la table:
Cependant, j'ai essayé de tester cette configuration, et cela ne fonctionne pas comme je l'attendais, il serait. Par exemple:
OK, donc c'est ce qui est prévu. No de ligne du parent, si une ligne ne devrait pas être autorisé dans la table enfant, cependant:
Regarde comme il vient de laisser cette ligne s'insérés sans faillir, même si il n'ya pas de lignes de t1 avec 2, null à tous!
J'ai été surpris par ce comportement, comme l'index unique sur t1 se comporte comme vous vous attendez à (1 seule ligne peut être inséré avec 1, null, etc).
Si vous utilisez "reportable au départ différé" sur la clé primaire, vous pouvez AVOIR des valeurs NULLES...