數據庫約束
概念:
數據庫約束是關系型數據庫的一個重要功能,主要是保證數據的完整性,也可理解為數據的正確性(數據本身是否正確,關聯關系是否正確)(一般是用在指定列上)
常見的約束類型
1.NOT NULL?
not null 非空約束,沒有指定非空約束時,當前列可以為空,如果某一列定義為必填項,那么就可以使用not null (非空)約束
2.UNIQUE
unique唯一約束,保證某列的每行必須有唯一的值,比如說身份證號,學號
在KEY字段會顯示UNI 注意NULL可以重復插入
3.DEFAULT
defalut默認約束,規定沒有給列賦值時的默認值
注意雖然指定默認約束,但當我們手動指定這一列值為NULL時,插入值仍為NULL
4.PRIMARY KEY
primary key 主鍵約束 not null和unique 的結合,主鍵約束的列既是非空的也是唯一的 主鍵約束幫我們校驗了非空和唯一,這兩個校驗雖然在寫入數據時對效率有一定影響,但是與不做校驗相比,這個性能消耗還是可以承擔的(主鍵的后面的索引起到了非常重要的作用)
eg: id? bigint primary key auto_increasement(自增,讓數據庫自己幫我們維護主鍵的增長)
insert操作時,都會事先生成一個主鍵值,不管成功與否,主鍵值都會視為使用
主鍵值在數據表中有可能不連續
會為每臺服務器都預先分配一區段的主鍵值
一個表中不允許有兩個主鍵值,一個主鍵同時可以包含多個列(復合主鍵) ——在唯一校驗時,只有復合主鍵中所有列都相同才被判定為相同
5.FOREIGN KEY
foreign key 外鍵約束 保證一個表中的數據匹配另一個表中的參照完整性,本質上也是一個校驗的過程
表中某個列的值,必須是另一個表中的關鍵列或是唯一約束列的值,也就是當前表中值在另一個表中在另一個表中必須存在,且滿足主鍵或唯一約束
語法: foreign key(字段名) references 主表(列)
通過外鍵約束,保證數據的完整性和關系的正確性
當子表中存在依賴主表的記錄時,不允許刪除主表中的記錄,要刪只能先刪除子表記錄,再刪主表
6.CHECK
保證列中值符號指定的條件(在MYSQL8.0有效,MYSQL5.7無效)
check(要檢查的列=‘A’or~=‘B’)
表的設計
類、實體、表之間的關系
OOA面向對象分析--》OOD面向對象設計——》OOP面向對象編程
1.從需求中分析獲得類,類對應到數據庫中的實體,實體在數據庫表現為表,類中的屬性對應著表中的字段
2.確定類與類之間的關系(一對一,一對多,多對多,沒有關系)
3.使用SQL去創建具體表(設計表時會遵循一些規則,一般稱之為三大范式)
范式描述的是數據關系模型,一對一關系,一對多關系,多對多關系
三大范式
第一范式1NF
關系型數據庫的最基本的要求,不滿足第一范式就不可以稱之為關系型數據庫?
表中的字段不可再進行拆分(可以繼續拆分在關系型數據庫中是絕對不允許的)
在自定義表的時候,對應到數據中的數據類型,每個字段都可以用一個數據類型表示,那么當前這個表就天然的滿足第一范式
第二范式2NF
在滿足第一范式的基本上,不存在非關鍵字段對任意候選鍵的部分函數依賴(存在于復合主鍵的情況下)
任意候選鍵:可以理解為主鍵,外鍵,沒有主鍵時的唯一鍵
非關鍵字段:可以理解為非關鍵字段
部分函數依賴:對于由兩個或多個關鍵字段決定一條記錄的情況,如果一行數據中有些字段只與關鍵字段中的一個有關系,那么就說明它存在部分函數依賴
一個表中沒有復合主鍵,這樣的表天然滿足第二范式
不滿足第二范式可能出現的情況:
1.數據冗余? ? ? ? 2.更新異常? ? ? ? 3.插入異常? ? ? ? 4.刪除異常
第三范式3NF
在第二范式的基礎上,不存在非關鍵字段,對任一候選鍵的傳遞依賴
第三范式可以解決數據冗余,更新異常,插入異常,刪除異常的問題
實例之間的關系
1.一對一關系
比如登陸界面,一個實體是用戶,一個是賬號(登錄名,密碼)
在設計表時,先把實體之間的關系列出來
一對一關系,設計表時,兩種方式(1.把所有信息全放在一張表中? ?2.創建兩張表,分別記錄,并將兩張表進行關聯)
2.一對多關系
常見于學生與班級的關系(一個學生只能存在于一個班級,一個班級可以有多個學生)
3.多對多關系
一個學生可以選修多門課程,一門課程可以選多個學生
1.分別創建實體表
2.創建關系表,在關系表中為實體之間創建關聯關系