2

J'ai 2 tables: T_CAMPAGNE_SMS_REPARTITION et T_CAMPAGNE_SMS_EXECUTION.comment ajouter une clé étrangère à une clé primaire composite

En T_CAMPAGNE_SMS_REPARTITION il y a 2 clés primaires.

enter image description here

En T_CAMPAGNE_SMS_EXECUTION il y a 1 clé primaire et 4 clés étrangères.

enter image description here

Comment puis-je ajouter la 4e clé de CLE_PARTITIONT_CAMPAGNE_SMS_EXECUTION étrangère?

J'ai essayé:

ALTER TABLE "T_CAMPAGNE_SMS_EXECUTION" 
    add constraint FK_REPARTITION foreign key("CLE_REPARTITION") 
    references "T_CAMPAGNE_SMS_REPARTITION"("CLE_REPARTITION"); 

mais je suis arrivé cette erreur:

Erreur commençant à la ligne: 10 de la commande - 
ALTER TABLE "T_CAMPAGNE_SMS_EXECUTION" 
    add constraint FK_REPARTITION foreign key("CLE_REPARTITION") references "T_CAMPAGNE_SMS_REPARTITION"("CLE_REPARTITION") 
Rapport d'erreur - 
Erreur SQL : ORA-02270: pas de correspondance de clé primaire ou unique pour cette liste de colonnes 
02270. 00000 - "no matching unique or primary key for this column-list" 
*Cause: A REFERENCES clause in a CREATE/ALTER TABLE statement 
      gives a column-list for which there is no matching unique or primary 
      key constraint in the referenced table. 
*Action: Find the correct column names using the ALL_CONS_COLUMNS 
      catalog view 

J'ai essayé par un design comme celui-ci:

enter image description here

mais je reste obtenez le même message d'erreur.

+0

Nous ne pouvons pas vous dire comment changer ce code à moins que vous ne nous disiez ce que sont réellement les CK et les FK. Alors, découvrez ce que ces termes/déclarations signifient et trouvez ceux de votre design. Alors dis-nous. (Voir ma réponse.) – philipxy

+0

Vous pouvez déduire cela avec les écrans d'impression de datamodeler. Pas besoin d'avoir le code. – JulHaus

+0

@JulHaus Déduire quoi? – philipxy

Répondre

0

Vous avez une clé primaire composite composée de deux colonnes, mais dans votre clé étrangère vous ne faites référence qu'à l'une de ces deux colonnes.

Mettez une autre colonne dans votre T_CAMPAGNE_SMS_EXECUTION pour la deuxième colonne PK avec le nom CLE_LOT_REPARTITION

Après cela, changer votre contrainte FOREIGN KEY comme ceci:

ALTER TABLE "T_CAMPAGNE_SMS_EXECUTION" 
    add constraint FK_REPARTITION foreign key("CLE_REPARTITION", "CLE_LOT_REPARTITION") references "T_CAMPAGNE_SMS_REPARTITION"("CLE_REPARTITION", "CLE_LOT_REPARTITION"); 
+0

merci mais j'ai eu cette erreur à la place: ALTER TABLE "T_CAMPAGNE_SMS_EXECUTION" ajouter une contrainte FK_REPARTITION clé étrangère ("CLE_REPARTITION", "CLE_LOT_REPARTITION") références "T_CAMPAGNE_SMS_REPARTITION" ("CLE_REPARTITION", "CLE_LOT_REPARTITION") Rapport d'erreur - erreur SQL: ORA-00904: "CLE_LOT_REPARTITION": non Validé identificateur 00904. 00000 - "% s: identificateur non valide" * cause: * action: – user609511

+0

Avez-vous ajouté la Collez CLE_LOT_REPARTITION vers T_CAMPAGNE_SMS_EXECUTION? – ggradnig

+0

non, je ne peux pas faire cela, parce que quand je fais cela pas de suite à la logique métier ... je pense que je dois faire solution ronde ... il va rendre la colonne unique ... merci – user609511

1

Si vous ne voulez pas ajouter un Colonne dans T_CAMPAGNE_SMS_EXECUTION puis créez une clé primaire technique sur T_CAMPAGNE_SMS_REPARTITION. Quelque chose comme T_CAMPAGNE_SMS_REPARTITION_ID qui est un nombre simple lié à une séquence (ou une colonne IDENTITY si vous avez un Oracle 12, voir le document ici https://oracle-base.com/articles/12c/identity-columns-in-oracle-12cr1).

Modifiez la contrainte de clé primaire en une contrainte unique sur T_CAMPAGNE_SMS_REPARTITION pour conserver le comportement et créez une nouvelle colonne dans T_CAMPAGNE_SMS_EXECUTION pour lier la nouvelle colonne. Le fait est que vous ne pouvez pas référencer une seule partie du PK composite car vous n'avez aucun moyen de vous assurer qu'il est unique.

Hope this helps

+0

Le code donné est incohérent. Nous ne savons pas quelle partie est erronée. Nous ne savons donc pas ce qui serait bien. – philipxy

0

Une table a un ou plusieurs CKs (candidate keys): ensembles de colonnes uniques qui ne contiennent pas des ensembles de colonnes plus petites uniques. Au plus un CK peut être déclaré PK (clé primaire) par table par PRIMARY KEY; déclare les autres via UNIQUE NON NULL.

Vous avez un PK, avec deux colonnes. Ayant plus d'une colonne, il est composite.

Une clé SQL FOREIGN est une liste de colonnes dont les valeurs apparaissent ailleurs comme SQL PRIMARY KEY ou UNIQUE NOT NULL. Et la liste référencée doit être déclarée unique même si elle contient un autre ensemble de colonnes unique déclaré.Votre liste référencée (CLE_REPARTITION) n'est pas déclarée unique. Donc exactement comme le message d'erreur dit, there is no matching unique or primary key constraint in the referenced table. Peut-être que vous voulez deux PK non-composite à une colonne au lieu du PK à 2 colonnes. Peut-être que juste (CLE_REPARTITION) est un CK/PK. Peut-être que vous voulez un FK SQL composite au lieu de celui à 1 colonne. Peut-être que vous voulez que les sous-répertoires de T_CAMPAGNE_SMS_REPARTITION (CLE_REPARTITION) soient T_CAMPAGNE_SMS_EXECUTION (CLE_REPARTITION) sous-répertoires même s'ils ne sont pas uniques. Ce n'est pas un FK. C'est un IND (dépendance d'inclusion). Cela nécessite un déclencheur à appliquer.

Ces contraintes sont déterminées par ce qu'une ligne indique lorsqu'elle se trouve dans une table dans une situation métier et quelles situations/états peuvent survenir en fonction des règles métier. Déterminez exactement quelles sont les contraintes sur vos tables et déclarez-les par dessus.