關系型數據庫實體間有三種關聯關系:一對一,一對多,多對多。
一對一關系(1:1):
如果實體集(表)A 中的每一個實休(就是每行記錄),在實體集B中只有一條數據與它對應,
反之實體集B 中的每一個實體,在實體A中只有一條數據與它對應
這樣的實體關系主是一對一關系
實例:
員工表、員工詳細信息表之間的關系是員工表中的一行與詳細信息表中的一行對應
一對多關系(1:n):
如果實體集A中每一個實體,在實體集B中有n個與之對應(n>1)(當n為1時,就是一對一的關系)
反之在實體集B中每一個實體,在實體集A中最多只有一個實體與之對應
這樣的實體就是一對多關系
實例:
學生表與班級表,多個學生屬於同一個班級,班級表中的一行與學生表的多行數據對應
在學生表中新增字段(班級號),該字段作為學生表的外鍵與班級表中的班級號關聯。每一個學生實體在班級號字段的值,表示該學生屬於的班級。
多對多關系(m:n):
如果實體集A中每一個實體,在實體集B中有m個與之對應(m>1)
反之如果實體集B中每一個實體,在實體集A中也有n個與之對應(n>1)
這樣的實體關系就是多對多關系
實例:
學生表與教師表,一位學生有多位老師來教,一位老師也可以教多位學生,可以看作由兩個一對多關系組合而成
外鍵:
mysql中的innodb引擎才支持外鍵
A實體的某個字段指向 B實體的主鍵, 則稱A實體的那個字段為該實體的外鍵, 一個表里可以有多個外鍵,也可以沒有外鍵;
被指向的實體稱為主實體(主表),也叫父實體(父表),負責指向的實體稱為從實體(從表),也叫子實體(子表)。
一般在哪個表里定義外鍵,這個表就是子表
在創建的時候應該先創建主表,然后再創建從表, 插入數據時也應該先插入主表數據
在刪除表的時候應該先刪除從表(子表), 然后再刪除主表
設置級聯操作
在主表發生數據改變時,與之相關的從表應該要怎么處理
可以使用關鍵詞on update, on delete來標識
允許的級聯操作有:
- cascade: 如果主表更新或者刪除數據時,那么從表也會執行相應的操作
- set null: 如果主表更新或者刪除數據時, 那么從表相應的數據會設置成null
- restrict: 拒絕主表的操作(默認)
/*刪除主表信息時,從表相應的字段設置為null(該字段定義時能為null)*/ Alter table student add foreign key (class_id) references class (class_id) On delete set null
/*主表執行刪除或更新時,從表執行同樣的操作*/ alter table student add foreign key (class_id) references class (class_id) on delete cascade on update cascade