What is a proper naming convention for MySQL FKs?

Being that they must be unique, what should I name FK's in a MySQL DB?

70559 次浏览

在 MySQL 中,不需要为外键约束赋予一个符号名称。如果未指定名称,InnoDB 将自动创建唯一名称。

无论如何,这是我使用的约定:

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一样。如果这不实用,我还将引用的字段名附加到外键名。

This naming convention allows me to "guess" the symbolic name just by looking at the table definitions, and in addition it also guarantees unique names.

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

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


CREATE TABLE messages(
id int,
user_id    int
);

user_id in messages table is a fk field so it has to make clear which id is (user_id).

在我看来,一个完全自我解释的变数命名原则可能是:

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


i.e.: `fk_messages_user_id_users_id`

注:

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

    fk_messages_user_user_id_users_id

换句话说,如果你也使用“引用/引用字段”变数命名原则(当然,你也可以选择你自己的) ,那么外键变数命名原则可以确保你的名字是唯一的。

If you don't find yourself referencing fk's that often after they are created, one option is to keep it simple and let MySQL do the naming for you (as Daniel Vassallo 在他的回答的开头提到).

虽然您不能使用这个方法唯一地“猜测”约束名称,但是您可以通过运行一个查询轻松地找到外键约束名称:

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;

For example you might receive the following from the query:

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

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

fk-[referencing_table]-[referencing_field]

原因是 referencing_tablereferencing_field的组合在数据库中是唯一的。 This way make the foreign key name easy to read, for example:

table `user`:
id
name
role


table `article`:
id
content
created_user_id /* --> user.id */
reviewed_user_id /* --> user.id */

我们有两把外国钥匙:

fk-article-created_user_id
fk-article-reviewed_user_id

user表名添加到外键名是多余的。