2011-08-06 3 views
0

Avec les tableaux ci-dessousViolation de contrainte sur insert

CREATE TABLE `Play` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `user_id` int(11) DEFAULT NULL, 
    `room_id` int(11) DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    KEY `IDX_FEBB7184A76ED395` (`user_id`), 
    KEY `IDX_FEBB718454177093` (`room_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 

CREATE TABLE `User` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `username` varchar(255) NOT NULL, 
    `nickname` varchar(255) NOT NULL, 
    `email` varchar(255) NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `UNIQ_2DA17977F85E0677` (`username`), 
    UNIQUE KEY `UNIQ_2DA17977A188FE64` (`nickname`), 
    UNIQUE KEY `UNIQ_2DA17977E7927C74` (`email`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 

INSERT INTO `User` VALUES(1, 'user', 'nickname', '[email protected]'); 

CREATE TABLE `Room` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 

INSERT INTO `Room` VALUES(1); 

ALTER TABLE `Play` 
    ADD CONSTRAINT `play_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `User` (`id`), 
    ADD CONSTRAINT `play_ibfk_2` FOREIGN KEY (`room_id`) REFERENCES `Room` (`id`); 

Et essayez d'exécuter l'instruction suivante

INSERT INTO `Play` (`id` ,`user_id` ,`room_id`) VALUES (NULL , '1', '1') 

Je reçois une erreur

#1452 - Cannot add or update a child row: a foreign key constraint fails 
(`play`, CONSTRAINT `play_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `User` (`id`)) 

Les deux ensembles de données, # 1 L'utilisateur et le numéro 1 de Room existent dans la base de données. Comment cela peut-il échouer? Je suis assez familier avec SQL, mais je n'ai aucune idée de ce que l'erreur est dans ce cas ...

+0

C'est idiot mais juste pour être sûr de ce que vous obtenez quand vous sélectionnez l'ID de 'User' où id = '1'? – yokoloko

+0

Eh bien, si je vérifie pour '1', j'obtiens l'utilisateur. Si je vérifie pour ''1'', j'obtiens une erreur, naturellement ... Mais pourquoi la requête essaye-t-elle d'insérer'' 1''? Je l'ai créé en utilisant phpMyAdmin, et il a automatiquement ajouté le '' '?? –

Répondre

1

L'a corrigé. Il est une question qui ne vient que lorsque vous utilisez MySQL 5.5.9, InnoDB et Mac OS X 10.6

Voir: MySQL Bug #60309

J'ai changé la .conf de MySQL pour ajouter cette ligne:

[mysqld] 
lower_case_table_names=1 

Et ça marche maintenant. Merci pour votre aide de toute façon.

0

Le problème réside uniquement dans l'ordre dans lequel vous exécutez les requêtes. Les tables "User" et "Room" doivent être définies avant de créer une contrainte de clé étrangère sur celles-ci.

+0

C'est seulement parce que je les ai exportés dans cet ordre. Toutes les tables existent déjà. –

+0

Ok, c'est intéressant. Parce que, j'ai copié collé vos requêtes exactes (avec l'ordre changé) dans MySQL et l'insertion a bien fonctionné! –

+0

Donc, peut-être un réglage quelque part? –

Questions connexes