1. なぜ外部キーが必要なのですか?
MySQL はリレーショナル データベースです. 実際のビジネスは相互に関連していることが多く、データベース内のテーブルも相互に関連していることがわかります. テーブル間の関係は、外部キーによって維持されます。理解を助けるために、実際の例を挙げましょう。
次に、学生のコース選択情報をデータベースに保存する必要があります。学生のコース選択テーブルの背後にあるすべての特定のコース情報を設計すると、多くのデータ冗長性が生じます。
したがって、学生コース選択テーブルにコースの id のみを格納し、id によってコース情報テーブルからコースの特定の情報を取得することもできます。つまり、 stu.course_id 間のマッピング関係を確立する必要があります。そしてcourse.id 。
これまでのところ、「外部キー」を実装し、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`))