mysql on delete关键字_MySQL外键约束On Delete、On Update各取值的含义
主鍵、外鍵和索引的區別?
主鍵
外鍵
索引
定義:
唯一標識一條記錄,不能有重復的,不允許為空
表的外鍵是另一表的主鍵,外鍵可以有重復的,可以是空值
主索引(由關鍵字PRIMARY定義的索引),用于表的主鍵上,不可重復,不可為空;
普通索引(由關鍵字KEY或INDEX定義的索引)可以重復;
唯一索引(由關鍵字UNIQUE定義的索引),不可重復,但可以有一個空值
作用:
用來保證數據完整性
用來和其他表建立聯系用的
是提高查詢排序的速度
個數:
主鍵只能有一個
一個表可以有多個外鍵
一個表只能有一個主索引,可以有多個其它類型索引
MySQL外鍵約束On Delete、On Update各取值的含義
?
先看On Delete屬性,可能取值如上圖為:No Action, Cascade,Set Null, Restrict屬性。
當取值為No Action或者Restrict時,則當在父表(即外鍵的來源表)中刪除對應記錄時,首先檢查該記錄是否有對應外鍵,如果有則不允許刪除。
當取值為Cascade時,則當在父表(即外鍵的來源表)中刪除對應記錄時,首先檢查該記錄是否有對應外鍵,如果有則也刪除外鍵在子表(即包含外鍵的表)中的記錄。
當取值為Set Null時,則當在父表(即外鍵的來源表)中刪除對應記錄時,首先檢查該記錄是否有對應外鍵,如果有則設置子表中該外鍵值為null(不過這就要求該外鍵允許取null)。
On Update是一樣的,
?
當取值為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),而應該先刪除外鍵,之后才可以刪除。
總結
以上是生活随笔為你收集整理的mysql on delete关键字_MySQL外键约束On Delete、On Update各取值的含义的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jtree+mysql_Swing:
- 下一篇: mysql 复杂sql 面试_PHP面试