初め
CONSTRAINTに「pk_favorite_food」のような名前を付ける必要があるのはなぜですか。その背後にある目的と使用法は何ですか?
制約に名前を割り当てる必要はありません。割り当てない場合、MySQLが内部的に名前を割り当てます。これは単なる識別子であり、後で制約を変更または削除するのが簡単になります。
その制約名なしでテーブルを作成してSHOW CREATE TABLE favodite_food;
から実行すると、上記で定義した名前と多少似ていますが、MySQLによって自動的に割り当てられた名前が表示されます。idx_favorite_food
自動的に作成される識別子は、主キーや制約のようなものになる可能性がfavorite_food_ibfk_1
あります。FOREIGN KEY
2番
どういうREFERENCES
意味ですか?
REFERENCES
FOREIGN KEY
は、列がどのテーブルのFOREIGN KEY
列を参照しているかを示すために制約で使用されるキーワードです。完全な構文の詳細については、制約に関するMySQLリファレンスを参照してください。FOREIGN KEY
あなたの例では、それはそれ自身の行に現れるので少し奇妙に見えます。本当に、それは定義に属していFOREIGN KEY
ます。
それが属する行にそれが表示されている場合は、もう少し明確になる可能性があります。
/* REFERENCES is a component of this FOREIGN KEY definition */
CONSTRAINT fk_fav_food_person_id FOREIGN KEY (person_id) REFERENCES person (person_id)
第3
CONSTRAINT pk_favorite_food PRIMARY KEY(person_id,food)
、ここで主キーとして2つの列を追加するのはなぜですか。
2つの部分PRIMARY KEY
は複合キーと呼ばれます。これは、単一の識別列(自動インクリメント値など)が必要ない場合に使用されますが、これら2つの列の組み合わせはテーブル内で一意である必要があるため、テーブル内の行を一意に識別できます。person_id
したがって、上記の例では、同じものを持つ2つの行を持つことはできないという事実を強制しますfood
。
INSERT INTO favorite_food (person_id, food) VALUES (1, 'apples'); /* works */
INSERT INTO favorite_food (person_id, food) VALUES (1, 'bananas'); /* works */
INSERT INTO favorite_food (person_id, food) VALUES (1, 'apples'); /* Fails! Person 1 already has apples and the pair must be unique */