Le référencement d'un à deux colonnes de clé primaire avec plusieurs clés étrangères
Prendre les deux tables suivantes dans Oracle:
Create Table A
( A int, B int, C int,
Constraint pk_ab Primary Key(A, B),
Unique (C)
);
Create Table B
( D int, E int, F int,
Constraint fk_d Foreign Key (D) References A(A),
Constraint fk_e Foreign Key (E) References A(B)
);
Pourquoi n'est-il pas énoncé de travail? Ou, plus précisément, pourquoi ne devrait-elle pas de travail? La raison pour laquelle je suis en train de créer ce type de relation est dire que, dans l'avenir, je veux supprimer B.D
, mais garder la relation FK_E
.
J'obtiens le message d'erreur:
ORA-02270: pas de correspondance unique ou de clé primaire de cette colonne liste
Ne vous obtenez une erreur? Je ne me souviens pas si Oracle applique cette, mais si
De sorte que le total des indices que vous avez sur
Hm, c'est de me crier dessus: ORA-00904: : identifiant invalide Oh, désolé, je n'avais pas remarqué votre première question, oui, j'obtiens une erreur. ORA-02270: pas de correspondance unique ou de clé primaire de cette colonne liste
A.A
et A.B
sont référencées comme FKs, ils peuvent chacun besoin d'un index, plutôt que de simplement le composite PK vous avez défini sur eux. Essayez de définir un index supplémentaire sur chacun de ces seules colonnes dans le Tableau A
.De sorte que le total des indices que vous avez sur
Table A
sont: PK (A,B), UNIQUE (C), INDEX (A), INDEX (B)
Hm, c'est de me crier dessus: ORA-00904: : identifiant invalide Oh, désolé, je n'avais pas remarqué votre première question, oui, j'obtiens une erreur. ORA-02270: pas de correspondance unique ou de clé primaire de cette colonne liste
OriginalL'auteur psidhu | 2013-01-27
Vous devez vous connecter pour publier un commentaire.
Vous avez défini la clé primaire sur Un comme un composé de deux colonnes (A,B). Une clé étrangère qui référence PK_AB doivent correspondre à celles des colonnes en nombre. C'est parce que d'une clé étrangère doivent identifier une seule ligne dans la table référencée qui possède une ligne donnée dans la table enfant. Le composé de la clé primaire moyens de la colonne A. Une peut contenir des doublons et donc la colonne A. B; seuls les permutations de (A,B) sont uniques. Par conséquent, le référencement de clé étrangère a besoin de deux colonnes.
Mal. B fait référence à une clé primaire unique, qui ne se comprennent plus d'une colonne,
Qui n'a pas de sens. Pensez-y de cette façon: D n'est pas une propriété de B, c'est un attribut B hérite de par sa dépendance dans le tableau A.
Une façon d'éviter cette situation est d'utiliser un substitut (ou synthétique). Composé de touches sont souvent les clés d'entreprise, d'où leurs colonnes sont significatifs dans un contexte d'affaires. Une caractéristique significative des valeurs de la colonne est qu'ils peuvent changer, et en cascade de tels changements de clés étrangères peut être salissant.
Mise en œuvre d'une clé de substitution devrait ressembler à ceci:
Bien sûr, vous pourriez genre de faire cela en utilisant le schéma que vous avez posté, vous avez déjà une unique contrainte de colonne sur Un(C). Cependant, je pense que c'est une mauvaise pratique de référence unique, les contraintes plutôt que des clés primaires, même si c'est permis. Je pense que cela en partie parce que les contraintes unique souvent appliquer une clé d'entreprise, d'où le sens, d'où le potentiel de changement, mais surtout parce que le référencement des clés primaires est juste le standard de l'industrie.
OriginalL'auteur APC
Essayez de créer deux indices distincts pour la colonne de
A
etB
avant la création de la tableB
Mais probablement vous avez besoin d'un composé FK sur la table
B
Je ne peux pas imaginer pourquoi auriez-vous besoin pour ce faire. La création des index séparés, comme je l'ai dit, vous permettra d'avoir séparé les clefs étrangères. Mais vous avez probablement besoin de complètement différent de la conception du schéma. Et pour vous aider avec ce que nous avons besoin de connaître vos besoins réels et non en termes d'as et Bs.
Haha, ma question n'a pas de tige de besoin, mais plutôt des précisions sur le "pourquoi" de Dire que vous n'avez pas besoin d'un attribut de plus, mais c'est une clé étrangère, comment s'en débarrasser? C'est mon objectif actuel.
Si c'est le seul but de créer des index séparés. Vous avez votre réponse déjà.
ya je suppose u r rite sur l'argent il y en pierre.. appris quelque chose aujourd'hui.
OriginalL'auteur peterm
Également la base de données ne peut pas valider une partielle null plusieurs clés étrangères, donc je pense que la contrainte de vérification doit également être ajouté à la table.
je me rends compte qu'il ne répond pas à ur question car u r catégorique sur le fait d'avoir 2 clés étrangères et u le savez probablement déjà, les multiples PK chose et u r d'essayer de se faufiler dans les entités qui sont vraiment seulement dépendante de la table A. dans le système.. je wud-dire de la table d'UN PK A, tableau B PK B, tableau C PK (C,D) FK (C,D) -> PK (A,B) ... maintenant, tables d'FK D -> PK UN... tableau E FK E -> PK B et d'une table de F FK (D,E) -> PK (A,B)
OriginalL'auteur user1974729