2017-06-13 1 views
0

J'ai deux tables InnoDB. La première table a une clé primaire de 2 champs avec les deux champs validés avec l'intégrité référentielle et tout fonctionne bien. La deuxième table valide contre la première en utilisant les mêmes deux champs:Contraintes de clé étrangère utilisant plusieurs champs

Tableau 1:

CREATE TABLE valid_combo(
season_id   CHAR(16) NOT NULL, 
ad_id    INT UNSIGNED NOT NULL, 
PRIMARY KEY (season_id, ad_id) 
)ENGINE=INNODB 
COMMENT='Parent Table of valid choices' 
; 

Création d'un enregistrement

INSERT INTO valid_combo (season_id, ad_id) VALUES ('SEASON', 100); 

Tableau 2:

CREATE TABLE user_combo(
uid    INT UNSIGNED NOT NULL, 
season_id   CHAR(3)  NOT NULL, 
ad_id    INT UNSIGNED NOT NULL, 
PRIMARY KEY (uid, season_id, ad_id), 
INDEX IDX_season_ad(season_id, ad_id), 
UNIQUE INDEX AK_seasons_users_ads(season_id, uid, ad_id), 
CONSTRAINT Refseason_ads451 FOREIGN KEY (season_id, ad_id) 
REFERENCES valid_combo(season_id, ad_id) 
)ENGINE=INNODB 
COMMENT='Child table with users choices out of valid combos' 
; 

D'une certaine manière, je Impossible d'ajouter un enregistrement que doit valider.

INSERT INTO user_combo (uid, season_id, ad_id) VALUES (200, 'SEASON', 100); 

Je reçois l'erreur:

ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`test`.`user_combo`, CONSTRAINT `Refseason_ads451` FOREIGN KEY (`season_id`, `ad_id`) REFERENCES `valid_combo` (`season_id`, `ad_id`)) 

Je sais et je vois que les valeurs référencées existent dans la table parent. Je suspecte plusieurs clés primaires de champ et l'intégrité référentielle est le coupable. Mais je peux me tromper et ne pas voir quelque chose d'évident.

La raison pour laquelle je n'utilise pas de champs individuels pour les validations dans leur table primaire respective est que la combinaison doit être valide et existante.

Des pensées?

+0

Il semblerait que les valeurs référencées n'existent pas dans le tableau . Parfois, les valeurs peuvent sembler identiques mais être différentes, par exemple si les chaînes ont des espaces autour d'elles. –

+0

NEVERMIND !! Je vois que les champs ne sont pas de la même taille .. Duh! Cela devient BEAUCOUP PLUS évident une fois que j'ai supprimé tous les autres champs et références. D'une certaine manière, simplifier et poser la question a beaucoup aidé. –

Répondre

1

Les champs season_id où pas la même taille ...

CHAR(16) and CHAR(3). 

Je ne sais pas comment fermer le sujet ..