之前在專案中遇到了這樣乙個問題,我舉得簡單的樣例來說明。
比方我們有兩個表,乙個表(department)存放的是部門的資訊,比如部門id,部門名稱等;還有乙個表是員工表(staff),員工表裡面肯定要存放每乙個員工所在的部門。
那問題來了,假設我們這個時候刪除了部門表中的某條記錄,在staff表中會發生什麼?
為了解答上面的問題,讓我們先來回想一下什麼是參照完整性。
我們經常希望保證在乙個關係中給定屬性集上的取值也在還有乙個關係的特定屬性集的取值**現。這樣的情況稱為參照完整性(referential integrity)
正如我們能夠用外碼在sql中的create table語句一部分的foreign key子句來聲名。
比如staff表中的我們能夠用foreign key(dep_name) references department來表明在每乙個員工組中指定的部門名稱dep_name必須在department關係中存在。
更一般地,令關係r1和r2的屬性集分別為r1和r2,主碼分別為k1和k2。假設要求對r2中隨意元祖t2,均存在r1中元祖t1使得t1.k1 = t2.α。我們稱r2的子集α為參照關係r1中k1的外碼(foreign key)
當我們違反了參照完整性約束時。通常的處理是拒絕執行導致完整性破壞的操作(即進行更新操作的事務被回滾)。
可是,在foreign key子句中能夠指明:假設被參照關係上的刪除或更新動作違反了約束,那麼系統必須採取一些步驟通過改動參照關係中的元祖來恢復完整性約束,而不是拒絕這種操作。
來看以下的樣例:
這是我們的department關係
create table department
( dept_name varchar(20),
building varchar(15),
primary key(department)
)
以下普通情況下我們的staff關係
create table staff
( id varchar(15),
name varchar(20), not null
dept_name varchar(20),
primary key (id),
foreign key(dept_name) reference department
)
以下是特定更新動作的staff關係
create table staff
( id varchar(15),
name varchar(20), not null
dept_name varchar(20),
primary key (id),
foreign key(dept_name) reference department
on delete cascade
on update cascade
)
因為有了外碼聲名相關聯的on delete cascade子句,假設刪除department中的元祖導致了此參照完整性約束被違反,則刪除並不被系統拒絕。而是對staff關係作聯機刪除。即刪除參照了被刪除系的元祖。
類似的。on update cascade會在更新時同步進行參照關係中元祖的更新。sql還同意foreign key子句指明除了cascade以外的其它動作,假設約束被違反,可將參考與置為null(用set null取代 cascade)。或者置為預設值(set default)。
可是,一般來說,我們習慣的使用方法是。不同意刪除。假設實在要刪除。能夠在被參照關係中加乙個字段,來表明當前的記錄被刪除了。這樣也方便日後查詢等相關操作。
mysql 參照完整性 mysql參照完整性
該樓層疑似違規已被系統摺疊 隱藏此樓檢視此樓 mysql支援資料庫的參照完整性約束嗎?有四個表 表一的主鍵是的表二外鍵 表二的主鍵是表三的外來鍵 表三的主鍵是表四的外來鍵 請問 如果 刪除表一 表2 3 4 會自動刪除嗎?從 3.23.43b 開始 innodb 支援外來鍵約束特性。innodb 表...
mysql 參照完整性 mysql參照完整性
該樓層疑似違規已被系統摺疊 隱藏此樓檢視此樓 mysql支援資料庫的參照完整性約束嗎?有四個表 表一的主鍵是的表二外鍵 表二的主鍵是表三的外來鍵 表三的主鍵是表四的外來鍵 請問 如果 刪除表一 表2 3 4 會自動刪除嗎?從 3.23.43b 開始 innodb 支援外來鍵約束特性。innodb 表...
mysql 參照完整性規則 mysql參照完整性
該樓層疑似違規已被系統摺疊 隱藏此樓檢視此樓 mysql支援資料庫的參照完整性約束嗎?有四個表 表一的主鍵是的表二外鍵 表二的主鍵是表三的外來鍵 表三的主鍵是表四的外來鍵 請問 如果 刪除表一 表2 3 4 會自動刪除嗎?從 3.23.43b 開始 innodb 支援外來鍵約束特性。innodb 表...