先看On Delete屬性,可能取值如上圖為:No Action, Cascade,Set Null, Restrict屬性。
當取值為No Action或者Restrict時,則當在父表(即外鍵的來源表)中刪除對應記錄時,首先檢查該記錄是否有對應外鍵,如果有則不允許刪除。
當取值為Cascade時,則當在父表(即外鍵的來源表)中刪除對應記錄時,首先檢查該記錄是否有對應外鍵,如果有則也刪除外鍵在子表(即包含外鍵的表)中的記錄。
當取值為Set Null時,則當在父表(即外鍵的來源表)中刪除對應記錄時,首先檢查該記錄是否有對應外鍵,如果有則設置子表中該外鍵值為null(不過這就要求該外鍵允許取null)。
當取值為No Action或者Restrict時,則當在父表(即外鍵的來源表)中更新對應記錄時,首先檢查該記錄是否有對應外鍵,如果有則不允許更新。
當取值為Cascade時,則當在父表(即外鍵的來源表)中更新對應記錄時,首先檢查該記錄是否有對應外鍵,如果有則也更新外鍵在子表(即包含外鍵的表)中的記錄。
當取值為Set Null時,則當在父表(即外鍵的來源表)中更新對應記錄時,首先檢查該記錄是否有對應外鍵,如果有則設置子表中該外鍵值為null(不過這就要求該外鍵允許取null)。
比如我有這樣兩張表:
tbluser用戶表: DROP TABLE IF EXISTS `filedb`.`tbluser`; CREATE TABLE `filedb`.`tbluser` ( `UserID` varchar(50) NOT NULL COMMENT '主鍵', `UserName` varchar(40) NOT NULL COMMENT '用戶姓名', `UserMail` varchar(50) NOT NULL COMMENT '用戶郵箱', `UserPassword` varchar(50) NOT NULL COMMENT '密碼', `UserType` tinyint(3) unsigned DEFAULT '0' COMMENT '默認為0,表示普通用戶', `UserCreated` datetime DEFAULT '0000-00-00 00:00:00', PRIMARY KEY (`UserID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
---------------------------------------------------------------------------------------------------------------- tblfile文件(用戶的文件)表: DROP TABLE IF EXISTS `filedb`.`tblfile`; CREATE TABLE `filedb`.`tblfile` ( `FileID` int(10) unsigned NOT NULL AUTO_INCREMENT, `FileOwner` varchar(50) DEFAULT NULL COMMENT '外鍵,引用用戶表', `FileName` varchar(200) NOT NULL COMMENT '文件原始名稱', `FilePath` varchar(200) NOT NULL COMMENT '文件存放路徑', `FileType` varchar(10) NOT NULL COMMENT '文件類型', `FileSubject` varchar(100) NOT NULL COMMENT '文件標題', `FileCreated` datetime DEFAULT '0000-00-00 00:00:00' COMMENT '創建時間', PRIMARY KEY (`FileID`), KEY `FK_tblfile_1` (`FileOwner`), CONSTRAINT `FK_tblfile_1` FOREIGN KEY (`FileOwner`) REFERENCES `tbluser` (`UserID`) ON DELETE SET NULL ON UPDATE CASCADE ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; -------------------------------------------------------------------------------------------------
上面可以看出FileOwner是文件表的外鍵,引用的是用戶表的UserID。且這里外鍵約束設置為"ON DELETE SET NULL ON UPDATE CASCADE "
現在用戶表有記錄(省略其他無關的字段):
UserID
ST001
,而文件表有記錄
FileID FileOwner 1 ST001
那 么如果我刪除用戶表中ST001對應記錄時,則根據ON DELETE SET NULL規則,文件表中FileOwner應該被設置為null,動手嘗試后也確實如此;如果我將用戶表中ST001改為ST003,則根據ON UPDATE CASCADE規則,文件表中FileOwner應該連鎖設置為ST003,也的確如此。
外鍵的使用對於減少數據庫冗余性,以及保證數據完整性和一致性有很大作用。
另外注意,如果兩張表之間存在外鍵關系,則MySQL不能直接刪除表(Drop Table),而應該先刪除外鍵,之后才可以刪除