MySQL外鍵約束On Delete、On Update各取值的含義


先看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),而應該先刪除外鍵,之后才可以刪除


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM