實體關系
表設計
1:1
兩個實體表內,存在相同的主鍵字段
如果記錄的主鍵值等於另一個關系表內記錄的主鍵值,則兩條記錄的對應為一一對應
優化上稱為垂直分割
1:n
一個實體對應多個其他實體(一個班級對應多個學生)
設計:在多的那段增加一個字段,用於指向該實體所屬的另外實體的標識
M:n
多對多
設計典型的利用一個中間表表示實體之間的對應關系。中間表的每一條記錄表示一個關系。
可以分析:一個m:n可拆解為 1:m 1:n來實現
外鍵 foreign key
概念:如果一個實體(student)的某個字段(student:class_id)指向(引用)另一個實體(class)的主鍵(class:class_id)
就稱student實體的class_id是這兩個實體關聯的外鍵。
被指向的實體稱為主實體(主表),也叫父實體(父表)
負責指向的實體稱為從實體(從表),也叫子實體(子表)
一般在哪個表里定義外鍵 這個表就是子表
作用:
約束處於關系內的實體
增加子表記錄時,是否有與之對應的父表記錄。刪除和更新主表記錄時,從表應該如何處理與之相關的記錄。
定義一個外鍵
在從表上增加一個外鍵字段,指向主表的主鍵 使用關鍵字 foreign key
Foreign key (外鍵字段) references 主表名 (關聯字段) [主表記錄刪除時動作][主表記錄更新時記錄]
建完表后插入
在子表增加記錄時,父表中必須有與之對應的記錄存在
設置級聯操作
在主表數據發生改變時,與之關聯的從表數據該如何變化
主表更新
主表刪除
使用關鍵字on update,on delete來標識
允許的級聯操作:
Cascade:關聯操作如果主表被刪除,那么從表也會執行相關的操作
Set null : 設置為null表示從表不指向任何主表記錄
Restrict :拒絕主表的相關操作
修改外鍵:先刪除再新建外鍵,通過修改表來完成。
Alter table student drop foreign key (class_id) 有問題
刪除外鍵需要通過指定外鍵名達到目的
可以通過創建外鍵時指定名稱或者使用Mysql默認生成的名稱
新建外鍵:
Alter table student add foreign key (class_id) references class (class_id)
On delete set null
注意關聯的字段必須類型一致
在class_id定義時要能為null
On update指的是只有主表的主鍵發生變化,才能對從表產生影響。
現在表中數據默認都是restrict show 里默認不顯示
Php實際項目中只有關聯,不設置外鍵,刪除或更新時通過sql語句疊加操作
有名無實,在支持外鍵的存儲引擎表中才能使用(只有innodb)