mysqlの外部キー設定

PHPz
PHPzオリジナル
2023-05-14 10:24:094460ブラウズ

MySQL は、最も人気のあるオープンソースのリレーショナル データベース管理システムの 1 つです。 MySQL は非常に強力ですが、複雑なデータ テーブルの構造や関係に直面すると、非常に複雑になり、問題が発生することがあります。この問題を解決するために、MySQL は外部キー制約を提供します。外部キー制約は、データ テーブル間の関係の整合性を確保する方法です。この記事では、MySQL の外部キー設定と関連アプリケーションについて詳しく説明します。

外部キーとは何ですか?

データベースでは、テーブルの列はフィールドまたはテーブルの属性と呼ばれます。たとえば、電子商取引 Web サイトのデータベースでは、ユーザーの携帯電話番号が「user」(ユーザー) という名前のテーブルに格納され、ユーザーの注文が「order」(注文) middle という名前の別のテーブルに格納されます。これら 2 つのテーブルの間には関係があり、ユーザーは複数の注文を行うことができますが、1 つの注文は 1 人のユーザーにのみ属することができます。

外部キーはリレーショナル データベース用語で、2 つのテーブルを結合する制約です。外部キー制約により、あるテーブルが別のテーブルのデータを参照するときに、そのインスタンスが他のテーブルの値と一致する必要があります。

外部キーの利点は、データ テーブル間の関係の整合性が保証されることです。これは、2 つのテーブル間に外部キー制約がある場合、主テーブルのレコードが削除または更新されると、それに依存するすべての外部キーが自動的に削除または更新されることを意味します。

外部キーを設定するにはどうすればよいですか?

外部キーを設定するには、使用している MySQL エンジンが外部キーをサポートしていることを確認する必要があります。現在、MySQL は MyISAM、InnoDB、NDB エンジンをサポートしています。このうち InnoDB は最も広く使用されているエンジンであり、外部キーをサポートする唯一の MySQL エンジンです。

外部キー制約を使用する場合は、テーブルが InnoDB エンジンを使用していることを確認してください。次のコマンドを実行して、テーブルのエンジン タイプを確認できます:

SHOW TABLE STATUS FROM database_name WHERE Name='table_name';

ここで、database_name はデータベース名、table_name はテーブルの名前です。エンジンの種類を確認したい。

テーブルで外部キー制約をサポートしないエンジンを使用している場合は、InnoDB エンジンに変更して次のコマンドを実行する必要があります。

ALTER TABLE table_name ENGINE=InnoDB;

次に、テーブルと外部キー制約を追加します。対応するコード例は次のとおりです。

CREATE TABLE order (
    order_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    user_id INT NOT NULL,
    date_added DATETIME,
    FOREIGN KEY (user_id) REFERENCES user(user_id)
);

この例では、注文 ID (order_id)、ユーザー ID (user_id)、および日付 (date_added) フィールドを含む「order」(order) テーブルを作成します。 。次に、新しい注文を追加する前にユーザー ID が存在することを確認するために、「Orders」テーブルに外部キー制約を追加しました。

この制約式では、user_id は現在のテーブルのフィールド名、user は依存テーブルの名前、user_id は依存テーブルのフィールド名。さらに、FOREIGN KEY キーワードは外部キー制約を定義するために使用されます。

MySQL では、外部キー制約を CASCADESET NULL、または RESTRICT として定義することもできます。これらのオプションの説明は次のとおりです。

  • CASCADE: 親が指定されている場合、子も削除または更新されます。
  • SET NULL: 親項目が指定された場合、子項目の値は削除または Null に更新されます。
  • RESTRICT: 親が指定されている場合、子の削除または更新を禁止します。

以下は、CASCADESET NULL、および RESTRICT を選択した完全なコード例です:

-- 创建父表
CREATE TABLE user (
    user_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL,
    password VARCHAR(50) NOT NULL
);

-- 创建子表,并定义外键约束
CREATE TABLE order (
    order_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    user_id INT NOT NULL,
    date_added DATETIME,
    FOREIGN KEY (user_id) REFERENCES user(user_id)
        ON DELETE CASCADE
        ON UPDATE SET NULL
);

この例では、「Orders」テーブルに 2 つのオプションを追加します。 ON DELETE CASCADE オプションは、ユーザー レコードが削除されると、そのユーザーに関連付けられているすべての注文レコードも削除されることを示します。 ON UPDATE SET NULL オプションは、ユーザー レコードを更新するときに、注文レコードのユーザー ID が Null 値に設定されることを示します。

外部キーを使用するにはどうすればよいですか?

データベース プログラミングでは、いくつかの基本的なコマンドを使用して、外部キーを含むテーブルをクエリできます。以下にサンプル コードを示します。

-- 查找所有订单
SELECT * FROM order;

-- 查找用户John的所有订单
SELECT * FROM order WHERE user_id=(SELECT user_id FROM user WHERE username='John');

どちらの例でも、外部キー制約を含む "Orders" テーブルをクエリします。 2 番目の例では、ネストされたクエリを使用して、特定のユーザーの注文レコードをエクスポートしました。

変更操作を実行するときは、その変更が外部キー制約に違反していないことを確認してください。変更された値が外部キー制約を満たさない場合、エラーが発生します。この問題が発生した場合は、外部キー制約を満たすように適切なデータを変更します。以下に例を示します。

-- 修改订单,将John的所有订单修改为Jane的订单
UPDATE order SET user_id=(SELECT user_id FROM user WHERE username='Jane') WHERE user_id=(SELECT user_id FROM user WHERE username='John');

この例では、ユーザー「John」に属するすべての注文をユーザー「Jane」に属する注文に変更します。これを行う前に、ユーザー「Jane」がすでに存在していることを確認してください。

結論

MySQL の外部キー制約は、データベース関係の整合性を確保するために非常に重要です。この記事では、外部キー制約の作成と使用に役立つ例を示します。外部キー制約は MySQL エンジンの機能の 1 つであるため、テーブルを作成するときに正しいエンジンを選択する必要があります。外部キー制約を適切に設定すると、データ テーブルの安定性と保守性が向上します。

以上がmysqlの外部キー設定の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。