表之間的關系
foreign key
外鍵約束,用於指向另一個表的主鍵字段
# 創建表的時候添加外鍵
create table teacher(
id int primary key auto_increment,
name char(20),
gender char(1),
dept_id int,
foreign key(dept_id) references dept(id)
);
解釋:
foreign key(dept_id) references dept(id)
dept_id 表示當前表的外鍵字段
dept 表示要關聯哪個表
dept(id) id表示關聯的dept表的id字段
主表與從表
先有主表 再有從表
先有dept 再有teacher
foreign key 帶來的約束作用:
1.在從表中插入一條記錄,關聯了一個主表中不存在的id 導致插入失敗
必須保證部門id (外鍵的值) 必須是在主表中存在的
2.插入數據的順序
先插入主表記錄 在插入從表記錄
3.從表更新外鍵時也必須保證 外鍵的值在主表中是存在的
4.刪除主表記錄前 要保證從表中沒有外鍵關聯被刪除的id
delete from dept where id = 1;# 報錯
必須先刪除從表 再刪除主表
delete from teacher where dept_id = 1;
delete from dept where id = 1;
5.更新主表記錄的主鍵時 要保證從表中沒有外鍵關聯被刪除的id
6.必須先創建主表
7.刪除表 必須先刪除從表
強調:foreign key就是用來保證兩張表之間的關聯關系是正確的!
練習: 班級表 和 學員表
主表是班級
從表是學員 外鍵加給學員
create table class(
id int primary key auto_increment,
name char(20)
);
create table student(
id int primary key auto_increment,
name char(20),
gender char(1),
c_id int,
foreign key(c_id) references class(id)
);
級聯操作 cascade
當我們需要刪除部門(主表)信息 時,必須先刪除從表中關聯的數據,很麻煩
級聯操作指的就是,當你操作主表時,自動的操作從表
兩種級聯操作
1.級聯的刪除
當刪除主表時自動刪除從表中相關數據
2.級聯更新
當主表的主鍵更新時自動的更新關聯的從表數據
案例:以上面的班級個學員為例:
drop table if exists class;
# 如果這表存在 才執行刪除 可以避免報錯 if exists
# if not exists 如果不存在才執行
create table class(
id int primary key auto_increment,
name char(20)
);
insert into class values(null,"py9");
insert into class values(null,"py10");
#創建表的時候指定級聯操作
drop table if exists student;
create table student(
id int primary key auto_increment,
name char(20),
gender char(1),
c_id int,
foreign key(c_id) references class(id)
on update cascade
on delete cascade
);
# 級聯操作可以單獨使用 也可以一起使用 空格隔開即可
insert into student values(null,"jack","m",1);
insert into student values(null,"rose","m",1);
insert into student values(null,"tom","m",2);
外鍵的使用
什么時候使用外鍵:
表之間存在關聯關系 ,
首先要確定表之間的關系:
多對一
一對多(多對一)
或者
老師和部門的關系
老師的角度看
一個老師應該對應有一個部門
一個老師可以對應對多個部門? 不行 一個老師只能屬於一個部門 (要看具體業務要求)!
多個老師可以對應一個部門
多對一
部門的角度看
一個部門可以對應多個老師
一個部門可以對應一個老師
多個部門可以對應一個老師? 不行
一對多
如何處理一對多(多對一)?
在老師表中存儲 部門id
即多的一方存儲 一的一方的id
處理方式
在一的一方即teacher表中保存相應部門(多的一方)的編號;
案例:
#部門:
create table dept(
id int primary key auto_increment,
name char(20),
job char(50),
manager char(10)
);
#老師表:
create table teacher(
id int primary key auto_increment,
name char(20),
gender char(1),
dept_id int,
foreign key(t_id) references teacher(id),
);