Mysql外來鍵級聯動作(刪除和更新)

2021-08-06 03:56:30 字數 1051 閱讀 8052

在實際開發中,我們建立表和表之間關聯的時候很少用到外來鍵,但是有時候需要用到外來鍵,準確地說是用到外來鍵的級聯動作,例如你有一張使用者表,存了一些使用者的基本資訊user表,如果這張表中的屬性過多,我們可能需要另一張表也用來儲存使用者的資訊,比如存一些登入資訊,就叫login_user表,很明顯這時候在login_user中設定乙個外來鍵去關聯user表更合適,雖然不用外來鍵也可以達到效果(使用觸發器當然也行),為什麼要設定外來鍵呢?是因為我想在user表中刪除一條記錄的時候同時把user_login相應的記錄也刪除掉。好了於是我們在login_user表中新增了乙個外來鍵列user_id關聯user表中的id,這時user表就叫父表,我們現在研究的是父表的刪除和更新操作對子表的影響

這種影響有四個分類:cascade、set null 、restrict、no action。

1、cascade,如果你設定外來鍵的更新或刪除時設定為cascade,那麼你對父表的刪除或更新操作同時會刪除或更新到子表,就以上面的兩張表為例,你如果在user表中刪除了一條id=1,001的記錄,那麼user_login中外鍵列user_id=1001 的記錄都會被刪除掉(如果沒有的話當然不會刪嘍)。如果你把user表中的id=1002的記錄改為id=100002那麼在user_login表中外鍵列user_id=1002的記錄也會全部改為100002,如果你不修改user表中的對照列id,去修改別的屬性,那當然不會影響子表什麼。這就是cascade。

2、no action 和 restrict 相同,指子表中有關聯記錄的情況下父表相應的記錄不能更新或刪除,還是拿上面的例子說,如果user_login表中外鍵列user_id有乙個值為1004,同時user表中有一條記錄id=1004的話,那麼user表中id=1004的記錄是刪不掉的,你也不能修改它的id屬性,你一刪除或者修改id的話,mysql就會報出異常。

3、set null 這個根據字面意思就很好理解了以2 的例子如果你刪除user表中id=1004的記錄或者修改id=1004的id那麼子表user_login中user_id=1004的值就會變為null。

mysql只有innodb儲存引擎才有外來鍵約束,當你新增了外來鍵而沒有設定級聯動作時,預設為on action

mysql外來鍵級聯刪除

create table user id int 4 not null,enum f m default null,primary key id engine innodb default charset latin1 create table userinfo sn int 4 not null ...

mysql外來鍵級聯更新刪除

mysql支援外來鍵的儲存引擎只有innodb,在建立外來鍵的時候,要求父表必須有對應的索引,子表在建立外來鍵的時候也會自動建立對應的索引。在建立索引的時候,可以指定在刪除 更新父表時,對子表進行的相應操作,包括restrict no action set null和cascade。其中restri...

mysql外來鍵級聯刪除示例

1.先建立兩個表 使用者,create table user id int primary key auto increment,主鍵遞增 username varchar 50 password varchar 50 create table music id int primary key au...