2009-05-30 8 views
0

J'ai une table contenant 2 entrées.Suggestions d'insertion avec contrainte de clé étrangère dans mysql

Quelque chose comme

CREATE TABLE `db`.`main` (
    `id` int(10) unsigned NOT NULL, 
    PRIMARY KEY (`id`) 
); 

L'id pour ces 2 entrées sont générées automatiquement les clés primaires.

J'ai une autre table avec une règle liant

CREATE TABLE `db`.`day` (
    `main_id` int(10) unsigned NOT NULL, 
    `day` tinyint(4) NOT NULL, 
    CONSTRAINT `fk_db_main` FOREIGN KEY (`main_id`) REFERENCES `main` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION 
); 

maintenant je peux obtenir un résultat avec succès en utilisant

SELECT * FROM main where id='9'; 

mais quand je tente d'exécuter

INSERT INTO day (main_id, day) VALUES (9, 0); 

Je reçois

"Impossible d'ajouter ou de mettre à jour une ligne enfant: une contrainte de clé étrangère échoue (db. day, CONTRAINTE fk_db_main FOREIGN KEY (main_id) RÉFÉRENCES main (id) ON SUPPRIMER AUCUNE ACTION SUR L'ACTION MISE À JOUR NO) (1452) »

Toutes les suggestions sur ce que je suis absent avec l'insert?

** I hadn La cause réelle était que la table db principale était dans MyISAM, et les tables InnoDB ne pouvaient pas créer une clé étrangère qui se connectait à MyISAM. les clés étrangères, même si elles proviennent d'autres tables

+0

L'instruction d'insertion semble correcte. –

+0

Je suis perplexe que vous pensez qu'il y a deux 'entrées' dans la table 'principale'. À mon avis, il y a une colonne - appelée ID - et c'est aussi la clé primaire de la table. –

+1

Aussi, pourquoi citez-vous le '9' dans le SELECT? Et quel résultat obtenez-vous lorsque vous exécutez le SELECT? –

Répondre

0

Je n'avais pas répertorié la cause réelle du problème en posant la question. La cause réelle était que la table db principale était dans MyISAM, et les tables InnoDB ne pouvaient pas créer une clé étrangère se connectant à elle. En bref, MyISAM ne prend pas en charge les clés étrangères, même lorsqu'elles proviennent d'autres tables.

1

La contrainte FOREIGN KEY indique "il doit y avoir un entrée dans la table 'main` avec une valeur d'ID qui correspond à la valeur' ​​main_id 'nouvellement insérée dans la table' day '".

Lorsque vous insérez la valeur 9 dans 'day', y a-t-il déjà une ligne dans 'main' avec ID = 9?

Le SGBD ne le pense pas - c'est pourquoi il s'est plaint.

+0

Oui, en sélectionnant l'ID de la valeur 9 de la main où ID est égal à 9 est de retour 9. – lief79

+0

OK - alors je pense que Alex Martelli est sur la bonne voie. Il y a une autre table appelée 'main' que celle appelée' db'.'main', et votre clé étrangère ne fait pas référence à la table que vous pensez. –

2

L'insert fonctionne pour moi si je retire les db. parties dans les déclarations CREATE TABLE (et l'insérer dans main une rangée avec un id de 9). Peut-être que le problème est que vous utilisez ce préfixe db. de manière incohérente, c'est-à-dire après TABLE mais pas dans la clause CONSTRAINT ...?

+0

+1 Oui, j'allais suggérer de vérifier la base de données que vous interrogez. –

+0

Voulez-vous dire que la création d'un déclencheur ne causerait pas de problèmes si les données dont il dépend n'existaient pas? Je vais devoir regarder ça. – lief79

Questions connexes