2017-05-26 1 views
0

Je ne suis pas tellement dans les bases de données et j'ai le problème suivant. J'utilise MySQL.Comment puis-je gérer cette relation un à plusieurs avec cette contrainte sur un champ non PK?

J'ai 2 tables comme suit:

1) transferts table:

CREATE TABLE transfers (
    id   BigInt NOT NULL AUTO_INCREMENT, 
    processed Char(1) NOT NULL, 
    providerpid VarChar(16) NOT NULL, 
    recipientpid VarChar(16) NOT NULL, 
    symbol  VarChar(128) NOT NULL, 
    `type`  VarChar(4) NOT NULL, 
    PRIMARY KEY (
     id 
) 
) ; 
ALTER TABLE transfers COMMENT = ''; 

2) annexe1 Table:

CREATE TABLE annex1 (
    id  BigInt NOT NULL AUTO_INCREMENT, 
    symbol VarChar(128) NOT NULL, 
    doi VarChar(256), 
    PRIMARY KEY (
     id 
) 
) ; 
ALTER TABLE annex1 COMMENT = ''; 

J'ai reçu l'exigence suivante qui semble assez étrange pour moi (mais peut-être qu'il me manque quelque chose):

Le annex1.symbol valeurs doivent être une valeur doivent être une référence importante étrangères de transfers.symbol.

D'après ce que je comprends, il devrait être parce que je dois utiliser JOIN avec ces 2 tables pour obtenir toutes les annexe1 documents relatifs à un transferts enregistrement (il est un relation un à plusieurs).

Mais je ne peux pas créer cela comme une FK contrainte sur annex1.symbol parce que le transfers.symbol est pas un PK.

Ai-je raté quelque chose? Puis-je spécifier d'une manière quelconque que le annex1.symbol doit contenir une valeur possible de transfers.symbol?

Répondre

2

MySQL nécessite des index sur des clés étrangères et les clés référencées afin que contrôles clés étrangers peuvent b e rapide et ne nécessite pas de scan de table. Dans la table de référence , il doit y avoir un index où les colonnes de clé étrangère sont répertoriées en tant que premières colonnes dans le même ordre. Un tel index est automatiquement créé sur le tableau de référence s'il n'existe pas . Cet index peut être supprimé plus tard, si vous créez un autre index qui peut être utilisé pour appliquer la contrainte de clé étrangère. nom_index, s'il est indiqué, est utilisé comme décrit précédemment.

https://dev.mysql.com/doc/refman/5.7/en/create-table-foreign-keys.html

Non nécessaire exactement PK, mais vous avez besoin d'index sur transfers.symbol colonne, pour ajouter FOREIGN KEY, quelque chose comme:

create index ix on transfers(symbol); -- If this column have (and WILL IN FUTURE ALSO) unique values only, you can define this as UNIQUE index. 

ALTER TABLE annex1 ADD CONSTRAINT fk FOREIGN KEY (symbol) REFERENCES transfers(symbol); 
1

Oui, vous avez raison, vous ne pouvez pas définir la relation sur la colonne non-clé, mais vous pouvez définir trop symbol comme clé primaire dans transfer table au moyen de composite primary key comme

PRIMARY KEY (id, symbol) 

(OR) définir symbol comme UNIQUE KEY CONSTRAINT et dans ce cas, ainsi vous pouvez avoir des relations FK sur cette colonne

+0

Dans quelle table? dans la table des transferts? – AndreaNobili

+0

@AndreaNobili, voir edit dans la réponse si cela aide – Rahul

+0

Que se passe-t-il si une définition comme UNIQUE KEY CONSTRAINT? Cela signifie que je peux avoir un seul enregistrement de la table des transferts lié à un seul enregistrement du tableau annexe1? Ou quoi? – AndreaNobili