50

ここでMySQLのドキュメントを見て、FOREIGN KEYとCONSTRAINTの違いを整理しようとしています。FKは制約だと思っていましたが、ドキュメントはそれらが別のものであるかのように話しているようです。

FK を作成するための構文は (一部)...

[CONSTRAINT [symbol]] FOREIGN KEY
    [index_name] (index_col_name, ...)
    REFERENCES tbl_name (index_col_name,...)

したがって、「CONSTRAINT」句はオプションです。なぜ入れたり入れなかったりするのですか?省略した場合、MySQL は外部キーを作成しますが、制約は作成しませんか? それとも、「CONSTRAINT」は FK の名前にすぎないので、指定しないと匿名の FK になるのでしょうか。

明確化をいただければ幸いです。

ありがとう、

イーサン

4

7 に答える 7

61

はい、外部キーは一種の制約です。MySQL の制約のサポートは一様ではありません。

  • PRIMARY KEY: テーブル制約および列制約としてはい。
  • FOREIGN KEY: テーブル制約としてはい、ただし InnoDB および BDB ストレージ エンジンのみ。それ以外の場合は解析されますが無視されます。
  • CHECK: すべてのストレージ エンジンで解析されますが無視されます。
  • UNIQUE: テーブル制約および列制約としてはい。
  • NOT NULL: はい、列の制約として。
  • DEFERRABLEおよびその他の制約属性: サポートなし。

このCONSTRAINT句を使用すると、メタデータを読みやすくするために、または制約を削除するときにその名前を使用するために、明示的に制約に名前を付けることができます。SQL 標準では、CONSTRAINT句はオプションである必要があります。省略した場合、RDBMS が自動的に名前を作成し、名前は実装次第です。

于 2008-11-21T23:58:04.880 に答える
9

一般に (MySQL である必要はありません)、外部キーは制約ですが、制約が常に外部キーであるとは限りません。主キー制約、一意制約などを考えてください。

特定の質問に戻って、正解です。CONSTRAINT [symbol] 部分を省略すると、自動生成された名前の FK が作成されます。

于 2008-11-22T00:01:51.953 に答える
4

現在、CREATE TABLE DDL はこの形式になっています。使用した UNIQUE KEY および FOREIGN KEY 定義構文に注目してください。

CREATE TABLE my_dbschema.my_table (
    id INT unsigned auto_increment PRIMARY KEY,
    account_nbr INT NOT NULL,
    account_name VARCHAR(50) NOT NULL,
    active_flg CHAR(1) NOT NULL DEFAULT 'Y',
    vendor_nbr INT NOT NULL,
    create_ts TIMESTAMP NOT NULL DEFAULT current_timestamp,
    create_usr_id VARCHAR(10) NOT NULL DEFAULT 'DFLTUSR',
    last_upd_ts TIMESTAMP NOT NULL DEFAULT current_timestamp ON UPDATE current_timestamp,
    last_upd_usr_id VARCHAR(10) NOT NULL DEFAULT 'DFLTUSR',
    UNIQUE KEY uk1_my_table(account_nbr, account_name),
    FOREIGN KEY fk1_my_table(vendor_nbr) REFERENCES vendor(vendor_nbr)
    );

この形式では、MySQL は uk1_my_table および fk1_my_table という名前の INDEX-es を自動的に作成します。ただし、FK オブジェクト名は my_table_ibfk_1 (つまり、tablename_ibfk_N – システム定義) とは異なります。その名前の FK db オブジェクトがないため、機能しません (したがってALTER TABLE my_table DROP FOREIGN KEY fk1_my_table、イライラしてアラームが発生します)。

これは、constarints に関する代替 DDL 形式です (参照: https://dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html ):-

CREATE TABLE my_dbschema.my_table (
    id INT unsigned auto_increment PRIMARY KEY,
    account_nbr INT NOT NULL,
    account_name VARCHAR(50) NOT NULL,
    active_flg CHAR(1) NOT NULL DEFAULT 'Y',
    vendor_nbr INT NOT NULL,
    create_ts TIMESTAMP NOT NULL DEFAULT current_timestamp,
    create_usr_id VARCHAR(10) NOT NULL DEFAULT 'DFLTUSR',
    last_upd_ts TIMESTAMP NOT NULL DEFAULT current_timestamp ON UPDATE current_timestamp,
    last_upd_usr_id VARCHAR(10) NOT NULL DEFAULT 'DFLTUSR',
    CONSTRAINT uk1_my_table UNIQUE KEY (account_nbr, account_name),
    CONSTRAINT fk1_my_table FOREIGN KEY (vendor_nbr) REFERENCES vendor(vendor_nbr)
    );

この形式では、MySQL は引き続き uk1_my_table および fk1_my_table という名前の INDEX-es を自動的に作成しますが、FK オブジェクト名は別のものではなく、DDL で言及されているように fk1_my_table です。そのようALTER TABLE my_table DROP FOREIGN KEY fk1_my_tableに機能しますが、同名の INDEX を残します。

ALTER TABLE my_table DROP INDEX fk1_my_tableまた、最初 (FK がまだドロップされていない場合) は機能せず、FK で使用されているというエラー メッセージが表示されることに注意してください。DROP FK コマンドが正常に実行された場合にのみ、DROP INDEX が機能します。

これが混乱を説明し、解決するのに役立つことを願っています。

于 2015-12-15T20:00:02.707 に答える
1

私が間違っていない場合、制約にはインデックスが必要です。たとえば、外部キー制約を作成すると、MySQLも自動的にインデックスを作成します。

于 2011-04-25T19:04:31.507 に答える
1

MySQL については答えられませんが、FK は制約です。データを特定の状態に強制するものはすべて制約です。制約にはいくつかの種類があり、Unique、Primary Key、Check、Foreign Keys はすべて制約です。多分MySQLには他にもあります。

コマンドで単語を使用できる場合もありますが、DELETE ステートメントの FROM のように、読みやすくするためにまったく必要ありません。

于 2008-11-21T23:47:45.570 に答える
0

これは、おそらく MySQL で最も紛らわしいトピックです。

たとえば、「PRIMARY KEY」、「FOREIGN KEY」、および「UNIQUE」キーは実際にはインデックスであると多くの人が言います。(MySQL の公式ドキュメントはここに含まれています)

一方、他の多くの人は、それらはむしろ制約であると言っています(これは理にかなっています。それらを使用すると、影響を受ける列に実際に制限を課しているからです)。

それらが本当にインデックスである場合、作成時にそのインデックスの名前を使用できるはずなので、名前を付けるために制約節を使用する意味は何ですか?

例:

... FOREIGN KEY index_name (col_name1, col_name2, ...)

FOREIGN KEY がインデックスの場合、 index_name を使用してそれを処理できるはずです。ただし、できません。

しかし、それらがインデックスではなく、インデックスを使用して機能する実際の制約である場合、これは理にかなっています。

いずれにせよ、私たちは知りません。実際、誰も知らないようです。

于 2010-07-11T23:00:19.490 に答える