【MySQL 入門ガイド】外部キー制約の使い方を詳しく解説

1. なぜ外部キーが必要なのですか?

 MySQL はリレーショナル データベースです. 実際のビジネスは相互に関連していることが多く、データベース内のテーブルも相互に関連していることがわかります. テーブル間の関係は、外部キーによって維持されます。理解を助けるために、実際の例を挙げましょう。

 次に、学生のコース選択情報をデータベースに保存する必要があります。学生のコース選択テーブルの背後にあるすべての特定のコース情報を設計すると、多くのデータ冗長性が生じます。

画像-20230428155753128

したがって、学生コース選択テーブルにコースの id のみを格納し、id によってコース情報テーブルからコースの特定の情報を取得することもできます。つまり、 stu.course_id 間のマッピング関係を確立する必要がありますそしてcourse.id 。

画像-20230428155835387

これまでのところ、「外部キー」を実装し、id を介して 2 つのテーブル間の関係を確立したようですが、外部キー制約 は確立していませんどのように理解していますか?

  • 管理者がスチュテーブルにデータを挿入すると、操作ミスにより存在しないデータが挿入される場合があるcourse_id
  • C++ コースはコース データ テーブルから突然削除されますが、stu テーブルにはこのコースを選択する学生がまだいます。

 上記の両方の状況は、誤った関係の確立につながります。つまり、セマンティック外部キーを実装しているように見えますが、2 つのテーブルは本質的に独立しています。したがって、MySQL は「必須」の信頼できる外部キー制約を維持する必要があります。

第二に、外部キーを設定する方法は?

foreign key (字段名) references 主表()

 外部キーは、マスター テーブルとスレーブ テーブルの間の関係を定義するために使用されます。外部キー制約は主にスレーブ テーブルで定義され、マスター テーブルには主キー制約または一意キー制約が必要です。外部キーを定義する場合、外部キー列のデータがメイン テーブルの主キー列に存在するか、またはnullである必要があります。上記の場合、stu テーブルはスレーブ テーブルに属し、コース テーブルはマスター テーブルに属します。

  • マスターテーブルを作成する

    mysql> create table course(
        -> id int primary key,
        -> name varchar(20) not null,
        -> time varchar(64) not null
        -> );
    Query OK, 0 rows affected (0.02 sec)
    
  • テーブルから作成

    mysql> create table stu(
        -> id int primary key,
        -> name varchar(10) not null,
        -> course_id int,
        -> foreign key(course_id) references course(id) -- 设置外键
        -> );
    Query OK, 0 rows affected (0.05 sec)
    
  • 通常どおりデータを挿入する

    mysql> insert into course values(11, 'C++', '9:00am');
    Query OK, 1 row affected (0.01 sec)
    
    mysql> insert into stu values(100, '张三', 11);
    Query OK, 1 row affected (0.00 sec)
    
  • 挿入されたコースは存在しません。外部キー制約の下で挿入が失敗する

    mysql> insert into stu values(101, '李四', 12);
    ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`db`.`stu`, CONSTRAINT `stu_ibfk_1` FOREIGN KEY (`course_id`) REFERENCES `course` (`id`))
    
  • 挿入できる値は NULL で、コースが選択されていないことを示します

    mysql> insert into stu values(101, '李四', NULL);
    Query OK, 1 row affected (0.00 sec)
    
  • このコースを受講している学生がまだいるため、外部キー制約の下でコースを削除できませんでした

    mysql> delete from course where id=11;
    ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`db`.`stu`, CONSTRAINT `stu_ibfk_1` FOREIGN KEY (`course_id`) REFERENCES `course` (`id`))
    

おすすめ

転載: blog.csdn.net/whc18858/article/details/130440371