mysql表之間的關系及級聯操作


表之間的關系

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),
	);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM