J'ai un problème un peu étrange. J'essaie d'ajouter une clé étrangère à une table qui fait référence à une autre, mais cela échoue pour une raison quelconque. Avec mes connaissances limitées de MySQL, la seule chose qui pourrait être suspecte est qu'il y a une clé étrangère sur une table différente qui fait référence à celle que j'essaie de référencer.
J'ai fait un SHOW CREATE TABLE
sur les deux tables, sourcecodes_tags
est la table avec la clé étrangère, sourcecodes
est la table référencée.
CREATE TABLE `sourcecodes` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`user_id` int(11) unsigned NOT NULL,
`language_id` int(11) unsigned NOT NULL,
`category_id` int(11) unsigned NOT NULL,
`title` varchar(40) CHARACTER SET utf8 NOT NULL,
`description` text CHARACTER SET utf8 NOT NULL,
`views` int(11) unsigned NOT NULL,
`downloads` int(11) unsigned NOT NULL,
`time_posted` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `user_id` (`user_id`),
KEY `language_id` (`language_id`),
KEY `category_id` (`category_id`),
CONSTRAINT `sourcecodes_ibfk_3` FOREIGN KEY (`language_id`) REFERENCES `languages` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `sourcecodes_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `sourcecodes_ibfk_2` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1
CREATE TABLE `sourcecodes_tags` (
`sourcecode_id` int(11) unsigned NOT NULL,
`tag_id` int(11) unsigned NOT NULL,
KEY `sourcecode_id` (`sourcecode_id`),
KEY `tag_id` (`tag_id`),
CONSTRAINT `sourcecodes_tags_ibfk_1` FOREIGN KEY (`tag_id`) REFERENCES `tags` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1
C'est le code qui génère l'erreur :
ALTER TABLE sourcecodes_tags ADD FOREIGN KEY (sourcecode_id) REFERENCES sourcecodes (id) ON DELETE CASCADE ON UPDATE CASCADE
2 votes
Pourriez-vous également afficher votre commande d'insertion/mise à jour qui entraîne l'erreur ?
66 votes
Vos tables sont-elles vides lorsque vous ajoutez cette clé étrangère ?
12 votes
Essayez d'exécuter cette requête pour voir s'il y a un Sourcecode_id qui n'est pas un vrai ID : SELECT sourcecode_id FROM sourcecodes_tags WHERE sourcecode_id NOT IN (SELECT id FROM sourcecodes AS tmp) ;
12 votes
Merci Zed, c'était le problème, l'un des tableaux contenait des données. En y réfléchissant maintenant, il est logique que le système échoue parce que certains éléments faisaient référence à des éléments inexistants, mais je ne l'aurais jamais deviné. Merci !
2 votes
Pourquoi cela échoue-t-il si la table est vide ?
0 votes
@Zim le lien vers votre photo est cassé
404
0 votes
Ajouté par erreur. Désolé !