回答:
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
上記の例のように、参照テーブルと参照テーブルで同じフィールド名を使用しようとしています。これが実用的でない場合は、参照されるフィールド名も外部キー名に追加します。
この命名規則により、テーブル定義を見ただけでシンボリック名を「推測」でき、さらに一意の名前が保証されます。
member_id
〜>テーブルメンバーへのリンク、edited_id
〜>編集されたユーザーの外部キー、テーブルメンバーへのリンク。それらにどのように名前を付ける必要がありますか?
私の選択は異なります。私の意見では、テーブルは単にid
フィールドuser_id
と呼ばれるので、テーブルにはフィールドではなくフィールドがあるはずuser
です。
CREATE TABLE users(
id int,
name varchar(100)
);
CREATE TABLE messages(
id int,
user_id int
);
user_id
でmessages
、それが(あるIDを明確にしなければならないので、テーブルFKフィールドです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
つまり、外部キーの命名規則では、「参照/参照フィールド」の命名規則も使用している場合は、一意の名前が確実に作成されます(もちろん、独自の名前を選択できます)。
$id
どのテーブルに属しているかわからない変数がどこかに見つかるでしょう。コードベースが古く、より多くの人がそれに取り組んでいるほど、その可能性は高くなります。
作成後にfkを頻繁に参照していることに気付かない場合、1つのオプションは、それを単純に保ち、MySQLに名前を付けさせることです(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;
たとえば、クエリから次のものを受け取ることがあります。
+------------+-------------+-----------------+-----------------------+------------------------+
| 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_table
ありreferencing_field
、データベース内で一意です。これにより、外部キーの名前が読みやすくなります。次に例を示します。
table `user`:
id
name
role
table `article`:
id
content
created_user_id /* --> user.id */
reviewed_user_id /* --> user.id */
したがって、2つの外部キーがあります。
fk-article-created_user_id
fk-article-reviewed_user_id
user
外部キー名にテーブル名を追加することは冗長です。
user_role
か?user
とrole
多対多の関係を持っており、user_role
すべての外部キーを含むテーブルです。それでいいのfk_user_role_role
?