2
CREATE TABLE favorite_food(
    person_id SMALLINT UNSIGNED,
    food VARCHAR(20),
    CONSTRAINT pk_favorite_food PRIMARY KEY(person_id,food),
    CONSTRAINT fk_fav_food_person_id FOREIGN KEY (person_id)
    REFERENCES person (person_id)
);

私は MySQL を初めて使用し、純粋にHTML と JS のバックグラウンドから来ました。ここでいくつか質問があります。

  1. CONSTRAINT に " " のような名前を付ける必要があるのはなぜですかpk_favorite_food。その背後にある目的と用途は何ですか?
  2. REFERENCES とはどういう意味ですか?
  3. CONSTRAINT pk_favorite_food PRIMARY KEY(person_id,food),ここで主キーとして 2 つの列を追加するのはなぜですか。
4

4 に答える 4

4

初め

CONSTRAINTに「pk_favorite_food」のような名前を付ける必要があるのはなぜですか。その背後にある目的と使用法は何ですか?

制約に名前を割り当てる必要はありません。割り当てない場合、MySQLが内部的に名前を割り当てます。これは単なる識別子であり、後で制約を変更または削除するのが簡単になります。

その制約名なしでテーブルを作成してSHOW CREATE TABLE favodite_food;から実行すると、上記で定義した名前と多少似ていますが、MySQLによって自動的に割り当てられた名前が表示されます。idx_favorite_food自動的に作成される識別子は、主キーや制約のようなものになる可能性がfavorite_food_ibfk_1あります。FOREIGN KEY

2番

どういうREFERENCES意味ですか?

REFERENCESFOREIGN 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 */
于 2012-11-28T13:36:07.580 に答える
1

1 つずつ返信します。

Q CONSTRAINT に " " のような名前を付ける必要があるのはなぜですかpk_favorite_food。その背後にある目的と用途は何ですか?

Aリレーショナル モデルでは、1 つの行を他のすべての行と区別できる必要があります。このため、値が行ごとに一意になるようにいくつかのフィールドを選択する必要があります。このフィールドの値の組み合わせについては、行のみがこの値でキャッチされるという確実性があります。

Q REFERENCES とはどういう意味ですか?

Aこれは、このフィールドに格納された値が、テーブルの別の行へのポインタのようなものであることを意味します。

Q CONSTRAINT pk_favorite_food PRIMARY KEY(person_id,food),ここで主キーとして 2 つの列を追加するのはなぜですか。

Aこの場合、1 つのフィールドでは不十分だからです。人のみを含める場合は、その人が好きな食べ物しか食べられないことを意味し、食べ物だけを食べる場合は、その食べ物が複数の人に好まれる可能性があることを意味します.

注意: これは基本的な説明です。リレーショナル モデルと整合性のリファレンスについて学ぶ必要があります。

于 2012-11-28T13:38:08.050 に答える
1

CONSTRAINT に名前を付ける必要があります。これは、データベースがそれをどこかに保存するためであり、その名前がその名前になります。たとえば、次のように実行します。

select *
from information_schema.table_constraints
where constraint_schema = 'YOUR_DB_NAME'

制約のリストが表示されます。それらのそれぞれに名前を付けて、それらを識別できるようにすることは理にかなっています。

参照キーワードは、外部キー関係で使用されるテーブルと列を定義するために使用されます。この場合、好きな食べ物の person_id は person テーブルの person_id を参照します。

主キーに関して - 使用する数は、開発者としてのあなた次第です。

ここのガイドなどのドキュメントを読むのに時間を費やすことをお勧めします: http://dev.mysql.com/doc/refman/5.0/en/tutorial.html

于 2012-11-28T13:38:24.367 に答える
1
  1. 名前は CONSTRAINT の機能を示しているため、後で何をしているのかを簡単に見つけることができます (たとえば、pk は PRIMARY KEY であり、fk は FOREIGN KEY です)。
  2. REFERENCES は、FOREIGN KEY の参照先テーブルを意味します。つまり、「favorite_food」テーブルの「person_id」は、person テーブルの「person_id」に参照されます。これには、favorite_food テーブルにデータをプッシュする場合、入力する「person_id」が「person」テーブルに存在する必要があるという効果があります。存在しない場合はエラーが発生するため、存在しない人に好きな食べ物を追加することはできません。
  3. この CONSTRAINT は、このテーブルの各エントリの PRIMARY KEY が列 'person_id' と 'food' を組み合わせたものであることを意味します。そのため、常に person と food の一意の組み合わせがあり、1 人が 1 つの好きな食べ物しか持てないということです。
于 2012-11-28T13:38:58.703 に答える