ホームページ  >  記事  >  データベース  >  mysqlで外部キーを設定する方法

mysqlで外部キーを設定する方法

WBOY
WBOY転載
2023-06-03 11:20:027429ブラウズ

外部キーとは何ですか?

データベースでは、テーブルの列はフィールドまたはテーブルの属性と呼ばれます。たとえば、電子商取引 Web サイトのデータベースでは、ユーザーの携帯電話番号が「user」(ユーザー) という名前のテーブルに格納され、ユーザーの注文が「order」(注文) middle という名前の別のテーブルに格納されます。これら 2 つのテーブルの間には 1 対多の関係があります。つまり、1 人のユーザーが複数の注文を持つことができ、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で外部キーを設定する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。