Étant donné qu'ils doivent être uniques, comment nommer les FK dans une base de données MySQL?
Réponses
Trop de publicités?Dans MySQL, il n'est pas nécessaire de donner un nom symbolique à des contraintes de clés étrangères. Si un nom n'est pas donné, InnoDB crée un nom unique automatiquement.
En tout cas, c'est la convention que j'utilise:
fk_[referencing table name]_[referenced table name]_[referencing field name]
Exemple:
CREATE TABLE users(
user_id int,
name varchar(100)
);
CREATE TABLE messages(
message_id int,
user_id int
);
ALTER TABLE messages ADD CONSTRAINT fk_messages_users_user_id
FOREIGN KEY (user_id) REFERENCES users(user_id);
J'essaie de coller avec les mêmes noms de champs dans le référencement et de tables de référence, en user_id
dans l'exemple ci-dessus. Lorsque ce n'est pas pratique, j'ai également ajouter le champ référencé nom pour le nom de clé étrangère.
Cette convention de nommage me permet de "deviner" le nom symbolique juste en regardant les définitions de table, et en outre, il garantit également des noms uniques.
mon choix est différent. à mon avis, un tableau doit avoir un champ "id", pas un "user_id", parce que la table est simplement appelé "utilisateur", donc:
CREATE TABLE users(
id int,
name varchar(100)
);
CREATE TABLE messages(
id int,
user_id int
);
"user_id" dans "messages" de la table est un fk champ de sorte qu'il doit être clair id ("user_id").
entièrement auto-explicatif convention de nommage, à mon avis, pourrait être:
fk_[referencing table name]_[referencing field name]_[referenced table name]_[referenced field name]
i.e.: fk_messages_user_id_users_id
note:
- vous pouvez, dans certains cas, omettre le deuxième élément ([référencement nom du champ])
-
cette fk pourrait est unique, parce que si un "messages_user" table existe, le référencement nom du champ doit être "user_id" (et non pas seulement "id") et le fk nom doit être:
fk_messages_user_user_id_users_id
en d'autres termes, une clé étrangère de la convention de nommage assurez-vous au sujet des noms uniques si vous utilisez également un "référencement/le champ référencé" convention d'affectation de noms (et vous pouvez choisir votre propre, bien sûr).
Si vous ne trouvez pas vous-même le référencement de fk est que, souvent, après leur création, une option est de rester simple et de laisser MySQL ne le naming pour vous (comme Daniel Vassallo mentionne au début de sa réponse).
Alors vous ne serez pas en mesure univoque de "deviner" les noms des contraintes avec cette méthode, vous pouvez facilement trouver la contrainte de clé étrangère nom en exécutant une requête:
use information_schema;
select TABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME, REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME from KEY_COLUMN_USAGE where REFERENCED_TABLE_SCHEMA = 'your_db_schema_name' ORDER BY TABLE_NAME;
Par exemple, vous pourriez recevoir la suite de la requête:
+------------+-------------+-----------------+-----------------------+------------------------+
| TABLE_NAME | COLUMN_NAME | CONSTRAINT_NAME | REFERENCED_TABLE_NAME | REFERENCED_COLUMN_NAME |
+------------+-------------+-----------------+-----------------------+------------------------+
| note | taskid | note_ibfk_2 | task | id |
| note | userid | note_ibfk_1 | user | id |
| task | userid | task_ibfk_1 | user | id |
+------------+-------------+-----------------+-----------------------+------------------------+
Si cette étape supplémentaire n'est pas trop pour vous, alors vous devriez être capable de trouver facilement le fk vous êtes à la recherche pour.