表與表之間的關系二
---恢復內容開始---
導語:
把所有的數據都存放於一張表的弊端
1:表的組織結構復雜不清晰
2:浪費空間
3:擴展性極差
一、 尋找表與表之間的關系套路:
舉例:emp 員工表 dep 部門表
步驟:
part1:
1、先站在左表 emp 的角度
2、去找左表emp 的多條記錄能否對應右表dep的一條記錄
3、翻譯2 的意義:
左表emp 的多條記錄==》》多個員工
右表dep 的一條記錄==》》一個部門
最終的翻譯結果:多個員工是否可以屬於同一個部門?
如果是則需要進行part2 的流程
part2:
1、先站在右表dep 的角度
2、去找右表dep 的多條記錄能否對應左表emp的一條記錄
3、翻譯2 的意義:
右表dep的多條記錄==》》多個員工
左表emp 的一條記錄==》》一個部門
最終的翻譯結果:多個部門是否可以包含同一個員工
如果不可以, 則可以確定emp與dep的 關系只一個單向的多對一
如何實現?
在emp表中新增一個dep_id 字段, 該字段指向dep表的id字段
配圖:
用foreign key 來實現 多對一
約束1:在創建表時, 先創建被關聯的表dep(也就是多對一中的一),在創建關聯表emp(多對一的多),否則就會報錯
約束2:在插入記錄時, 必須先插被關的表dep,才能插關聯表emp,否則也會報錯
3:約束3:更新與刪除都需要考慮到關聯與被關聯的關系
1:先刪除關聯表emp1,再刪除被關聯表dep1, 否則也會報錯
2:重建:新增功能,同步更新, 同步刪除 用on update cascade on delete cascade
先創建:
查詢數據:
同步刪除:delete from 表名 where + 條件
同步更新:update 表名 set 更改內容 where +條件
清空表:delete from tb1
q強調;上面這條命令確實可以將表裏的記錄都刪掉, 但是不會將id重置為0,
所有該條命令根本不是用來清空表的, delete是用來刪除表中某一些符合條件的記錄
delete from tb1 where id >10;
如果要清空表 要使用truncate tb1;
作用是將整張表重置。
如圖:刪掉id>3 以上的數據後 在添加新的數據, 是在原來沒有刪除的id的基礎上添加。所以這時不應該用 delete.
二:多對多
兩張表之間是一個雙向的多對一關系,稱之為多對多
如何實現
建立第3張表,該表中有一個字段fk 左表的id,還有一個字段fk 右表的id
例如:兩張表, 一個書表,一個作者表:
首先創造出這兩張表:
現在創造第3張表
查詢:
一對一
左表的一條記錄唯一對應右表的一條記錄,反之也一樣
配圖:
張鐵蛋 李大炮 楊力 趙子彈 劉二丫 王三炮 alex 梁樹東
創建表
插入數據:
查數據:
---恢復內容結束---
表與表之間的關系二