外來鍵: foreign key, 外面的鍵(鍵不在自己表中): 如果一張表中有乙個字段(非主鍵)指向另外一張表的主鍵,那麼將該字段稱之為外來鍵.
增加外來鍵
外來鍵可以在建立表的時候或者建立表之後增加(但是要考慮資料的問題).
一張表可以有多個外來鍵.
建立表的時候增加外來鍵: 在所有的表字段之後,使用foreign key(外來鍵字段) references 外部表(主鍵字段)
在新增表之後增加外來鍵: 修改表結構
alter table 表名 add [constraint 外鍵名字] foreign key(外來鍵字段) references 父表(主鍵字段);
修改外來鍵&刪除外來鍵
外來鍵不可修改: 只能先刪除後新增.
刪除外來鍵語法
alter table 表名 drop foreign key 外鍵名; – 一張表中可以有多個外來鍵,但是名字不能相同
外來鍵作用
外來鍵預設的作用有兩點: 乙個對父表,乙個對子表(外來鍵字段所在的表)
對子表約束: 子表資料進行寫操作(增和改)的時候, 如果對應的外來鍵字段在父表找不到對應的匹配: 那麼操作會失敗.(約束子表資料操作)
對父表約束: 父表資料進行寫操作(刪和改: 都必須涉及到主鍵本身), 如果對應的主鍵在子表中已經被資料所引用, 那麼就不允許操作
外來鍵條件
1.外來鍵要存在: 首先必須保證表的儲存引擎是innodb(預設的儲存引擎): 如果不是innodb儲存引擎,那麼外來鍵可以建立成功,但是沒有約束效果.
2.外來鍵字段的字段型別(列型別)必須與父表的主鍵型別完全一致.
3.一張表中的外鍵名字不能重複.
4.增加外來鍵的字段(資料已經存在),必須保證資料與父表主鍵要求對應.
外來鍵約束
所謂外來鍵約束: 就是指外來鍵的作用.
之前所講的外來鍵作用: 是預設的作用; 其實可以通過對外鍵的需求, 進行定製操作.
外來鍵約束有三種約束模式:都是針對父表的約束
district: 嚴格模式(預設的), 父表不能刪除或者更新乙個已經被子表資料引用的記錄
cascade: 級聯模式: 父表的操作, 對應子表關聯的資料也跟著被刪除
set null: 置空模式: 父表的操作之後,子表對應的資料(外來鍵字段)被置空
通常的乙個合理的做法(約束模式): 刪除的時候子表置空, 更新的時候子表級聯操作
指定模式的語法
foreign key(外來鍵字段) references 父表(主鍵字段) on delete set null on update cascade,
意思:在操作父表的時候,比如說刪除,字表對應的外來鍵會置空,如果父表更新,字表的外來鍵也隨父表更新。
更新操作: 級聯更新
刪除操作: 置空
刪除置空的前提條件: 外來鍵字段允許為空(如果不滿足條件,外來鍵無法建立)
外來鍵雖然很強大, 能夠進行各種約束: 但是對於php來講, 外來鍵的約束降低了php對資料的可控性: 通常在實際開發中, 很少使用外來鍵來處理.
Day05 MySQL 索引和事物
索引型別 功能說明 普通索引 最基本的索引,它沒有任何限制 唯一索引 某一行啟用了唯一索引則不准許這一列的行資料中有重複的值。針對這一列的每一行資料都要求是唯一的 unique 主鍵索引 它是一種特殊的唯一索引,不允許有空值。一般是在建表的時候同時建立主鍵索引,常用於使用者id。類似於書中的頁碼 p...
MySQL 資料庫外來鍵
如果表a的主關鍵字是表b中的字段,則該字段稱為表b的外來鍵,表a稱為主表,表b稱為從表。外來鍵是用來實現參照完整性的,不同的外來鍵約束方式將可以使兩張表緊密的結合起來,特別是修改或者刪除的級聯操作將使得日常的維護工作更加輕鬆。這裡以mysql為例,總結一下3種外來鍵約束方式的區別和聯絡。這裡以使用者...
MySQL資料庫外來鍵
設定外來鍵 外來鍵及功能 成績表 參照表也叫子表 中的學號來自學生表 被參照表也叫父表 成績表中的課程號來自課程表 當要刪除或更新被參照表中的給字段的值時,參照錶該字段的值如何改變。在on delete on update設定參照動作 restrict 限制 cascade 級聯 set null ...