Les clés étrangères dans MySQL?
J'ai été lentement l'apprentissage du SQL cours des dernières semaines. J'ai tout ramassé de l'algèbre relationnelle et les rudiments de la façon de bases de données relationnelles travail. Ce que j'essaie de faire maintenant est de savoir comment il est mis en œuvre.
Une pierre d'achoppement que j'ai rencontré dans cette, est des clés étrangères dans MySQL. Je n'arrive pas à trouver beaucoup plus sur les autres que le fait qu'ils existent dans le InnoDB schéma de stockage que MySQL a.
Ce qui est un exemple simple de clés étrangères, mis en œuvre dans MySQL?
Voici une partie d'un schéma que j'ai écrit qui ne semble pas être un travail si vous souhaitez plutôt signaler mes défauts que de me montrer un exemple de travail.
CREATE TABLE `posts` (
`pID` bigint(20) NOT NULL auto_increment,
`content` text NOT NULL,
`time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`uID` bigint(20) NOT NULL,
`wikiptr` bigint(20) default NULL,
`cID` bigint(20) NOT NULL,
PRIMARY KEY (`pID`),
Foreign Key(`cID`) references categories,
Foreign Key(`uID`) references users
) ENGINE=InnoDB;
Vous devez vous connecter pour publier un commentaire.
En supposant que vos catégories et de la table des utilisateurs déjà exister et contenir cID et uID respectivement comme clés primaires, cela devrait fonctionner:
Le nom de la colonne est requise dans le
references
clause.Édité: Robert et Vinko état que vous devez déclarer le nom de la colonne référencée dans la contrainte de clé étrangère. Cela est nécessaire en InnoDB, bien que dans le standard SQL, vous êtes autorisé à omettre la colonne référencée nom si c'est le même nom dans la table parent.
Une particularité que j'ai rencontré dans MySQL, c'est que la clé étrangère de la déclaration échoue silencieusement dans plusieurs circonstances:
Malheureusement, MySQL donne pas de message qu'il a échoué à créer la contrainte de clé étrangère. Il ignore simplement la demande, et crée la table sans la clé étrangère (si vous MONTREZ de CRÉER la TABLE de messages, on peut voir pas de clé étrangère de la déclaration). J'ai toujours pensé que c'est une mauvaise fonction de MySQL!
Astuce: l'argument entier pour des types de données entier (par exemple de type BIGINT(20)) n'est pas nécessaire. Il n'a rien à voir avec la taille de stockage de la colonne. BIGINT est toujours la même taille, quelle que soit l'argument que vous donnez. Le nombre désigne le nombre de chiffres MySQL pad de la colonne si vous utilisez la colonne zerofill ne modificateur.
Cette a un peu de code montrant comment créer des clés étrangères par eux-mêmes, et de CRÉER la TABLE.
Voici l'un des exemples les plus simples: il
Je suis d'accord avec Robert. Il vous manque le nom de la colonne dans la clause references (et vous devriez obtenir l'erreur 150). J'ajouterai que vous pouvez vérifier la façon dont les tables sont créées dans la réalité avec:
Les réponses précédentes composer avec la contrainte de clé étrangère. Alors que la contrainte de clé étrangère est certainement utile pour maintenir l'intégrité référentielle, le concept de "clé étrangère" lui-même est fondamental pour le modèle relationnel de données, indépendamment de l'utilisation de la contrainte ou non.
Chaque fois que vous faites un équi-jointure, vous êtes en assimilant une clé étrangère de quelque chose, généralement la clé, il les références. Exemple:
StudentCourses.StudentId est une clé étrangère référençant les Étudiants.StudentId.