什么是适用于MySQL FK的命名约定?

因为它们必须是唯一的,我应该在MySQL数据库中命名FK?

在MySQL中,不需要给外键约束赋予符号名称。 如果没有给出名字,InnoDB会自动创build一个唯一的名字。

无论如何,这是我使用的惯例:

fk_[referencing table name]_[referenced table name]_[referencing field name] 

例:

 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); 

我尝试在引用表和引用表中使用相同的字段名,如上例中的user_id所示。 当这不实际时,我也将引用的字段名称追加到外键名称。

这个命名约定允许我通过查看表定义来“猜测”符号名,另外它还保证了唯一的名称。

我的select是不同的。 在我看来,一个表应该有一个“id”字段,而不是“user_id”字段,因为table就是所谓的“user”,所以:

 CREATE TABLE users( id int, name varchar(100) ); CREATE TABLE messages( id int, user_id int ); 

“messages”表中的“user_id”是一个fk字段,因此必须清楚哪个id是(“user_id”)。

一个完全自我解释的命名约定,在我看来可能是:

 fk_[referencing table name]_[referencing field name]_[referenced table name]_[referenced field name] ie: fk_messages_user_id_users_id 

注意:

  • 您可以在某些情况下省略第二个元素([引用字段名称])
  • 这个fk可能是唯一的,因为如果存在“messages_user”表,那么引用字段名应该是“user_id”(而不仅仅是“id”),fk名应该是:

    fk_messages_user_user_id_users_id

换句话说,一个外键命名约定,如果你还使用“引用/引用字段”命名约定(当然,你可以select你自己的),你可以确定唯一的名字。

如果你没有发现自己经常创buildfk,那么一个select就是保持简单,让MySQL为你命名(就像Daniel Vassallo在他的回答开头提到的那样 )。

虽然您无法使用此方法唯一地“猜测”约束名称,但您可以通过运行查询轻松find外键约束名称:

 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; 

例如,您可能会从查询中收到以下内容:

 +------------+-------------+-----------------+-----------------------+------------------------+ | 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 | +------------+-------------+-----------------+-----------------------+------------------------+ 

如果这个额外的步骤不是太多,那么你应该能够很容易地find你正在寻找的fk。