• 當前位置: 首頁 / 廈門建站(zhàn)百科(kē) / 廈門常見(jiàn)問(wèn)題
  • mysql外(wài)鍵約束語句-級聯更新及删除

    時間(jiān):2024-04-21 浏覽量: 收藏

    mysql支持外(wài)鍵(foreign key),外(wài)鍵允許跨表交叉引用相(xiàng)關數據,另外(wài)外(wài)鍵約束能夠保證相(xiàng)關數據的一緻性。一個外(wài)鍵關系通(tōng)常包括一個父表和一個子表。父表包含原始的字段數據,子表引用父表中該字段的數據,外(wài)鍵約束定義在子表上。

    1. 外(wài)鍵定義的語法

    通(tōng)常在create table和alter table語句中定義外(wài)鍵約束,基本語法如下:

    [CONSTRAINT [symbol]] FOREIGN KEY

    [index_name] (col_name, ...)

    REFERENCES tbl_name (col_name,...)

    [ON DELETE reference_option]

    [ON UPDATE reference_option]

    reference_option:

    RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT

    CONSTRAINT symbol 爲外(wài)鍵約束名稱,如果沒有定義,InnoDB表會(huì)自(zì)動生成一個名稱,這(zhè)個名稱在數據庫裡(lǐ)面必須唯一。

    ON DELETE、ON UPDATE表示事件(jiàn)觸發時的動作,可(kě)設置值爲:

    CASCADE,更新或者删除父表記錄時,子表中的相(xiàng)應記錄同步更新或者删除。由級聯更新或者删除導緻的子表記錄修改,不(bù)會(huì)觸發子表的觸發器執行(xíng)。

    SET NULL,更新或者删除父表記錄時,子表中的相(xiàng)應記錄字段設置爲NULL,前提是(shì)子表中相(xiàng)應字段不(bù)能定義爲NOT NULL。

    RESTRICT,有外(wài)鍵關系約束時,拒絕父表記錄的更新和删除操作。

    NO ACTION,無動作,實際功能與RESTRICT相(xiàng)同。

    SET DEFAULT,僅僅解析器能識别,實際功能未實現(xiàn)。

    2. 級聯更新和級聯删除

    當父表對外(wài)鍵關聯的字段進行(xíng)update、delete操作時,子表對應的字段值也會(huì)同步變化(huà),稱之爲級聯更新或者級聯删除。當外(wài)鍵定義時,設置 referential action 爲CASCADE即可(kě)實現(xiàn)級聯更新與删除。

    示例:

    foreign key(parent_id) references parent(id) on update cascade

    foreign key(parent_id) references parent(id) on delete cascade

    foreign key(parent_id) references parent(id) on update cascade on delete cascade

    3. 外(wài)鍵約束案例

    3.1 外(wài)鍵約束字段值

    # 創建父表

    create table parent(id int, primary key(id));

    # 創建子表

    create table child(id int, parent_id int,

    foreign key(parent_id) references parent(id),

    primary key(id));

    子表child會(huì)自(zì)動在parent_id字段上加上索引。往子表插入數據或者更新數據時,parent_id字段值必須爲父表parent中已經存在的值,否則會(huì)報錯。如下:

    Cannot add or update a child row: a foreign key

    constraint fails (`db`.`child`, CONSTRAINT `child_ibfk_1`

    FOREIGN KEY (`parent_id`) REFERENCES `parent` (`id`))

    删除父表中有外(wài)鍵約束的記錄時,也會(huì)報錯,如下:

    Cannot delete or update a parent row: a foreign key

    constraint fails (`db`.`child`, CONSTRAINT `child_ibfk_1`

    FOREIGN KEY (`parent_id`) REFERENCES `parent` (`id`))

    3.2 外(wài)鍵級聯更新

    # 創建父表

    create table parent(id int, primary key(id));

    # 創建子表

    create table child(id int, parent_id int,

    foreign key(parent_id) references parent(id)

    on update cascade,

    primary key(id));

    更新父表parent的id字段值,那麽子表字段parent_id中相(xiàng)應的值也會(huì)同步更新。

    3.3 外(wài)鍵級聯删除

    # 創建父表

    create table parent(id int, primary key(id));

    # 創建子表

    create table child(id int, parent_id int,

    foreign key(parent_id) references parent(id)

    on delete cascade,

    primary key(id));

    删除父表parent的某個id字段值的記錄,那麽子表字段parent_id中相(xiàng)應值的記錄也會(huì)同步删除。

    3.4 删除外(wài)鍵

    alter table child drop foreign key child_ibfk_1;

    3.5 創建外(wài)鍵

    alter table child add foreign key(parent_id) references parent(id);

    4. 外(wài)鍵約束的條件(jiàn)和限制(zhì)

    父表和子表必須爲同一種存儲引擎,且不(bù)能定義爲臨時表。

    創建外(wài)鍵約束需要(yào)有REFERENCES權限。

    外(wài)鍵約束中使用的字段必須有相(xiàng)似的數據類型,整型的大(dà)小(xiǎo)必須相(xiàng)同,有無符号也必須相(xiàng)同。字符串類型的長度可(kě)以不(bù)相(xiàng)同,但(dàn)是(shì)字符集和校驗規則必須相(xiàng)同。

    外(wài)鍵約束的兩個字段可(kě)以在同一個表中,但(dàn)是(shì)不(bù)能是(shì)同一個字段。

    外(wài)鍵約束的字段上必須要(yào)有索引,以便加快(kuài)外(wài)鍵檢查,如果引用表上的外(wài)鍵字段沒有索引的話,MySQL會(huì)自(zì)動創建一個索引。

    不(bù)支持外(wài)鍵字段上的前綴索引,blob和text字段不(bù)能用于外(wài)鍵。

    InnoDB表外(wài)鍵約束不(bù)支持分(fēn)區。

    一個有外(wài)鍵約束的表不(bù)能修改其存儲引擎。

    外(wài)鍵約束不(bù)能引用虛拟字段。

    5. 禁用外(wài)鍵檢查

    MySQL通(tōng)過變量 foreign_key_checks 來(lái)開(kāi)啓或者禁用外(wài)鍵檢查,這(zhè)個變量作用範圍可(kě)以是(shì)全局,也可(kě)以是(shì)會(huì)話級别。有些場(chǎng)景,禁用外(wài)鍵檢查是(shì)非常有用的,比如:删除一個有外(wài)鍵約束引用的表。

    以不(bù)同的順序重新加載表,比如使用mysqldump導出的表,順序與外(wài)鍵約束的依賴順序不(bù)一緻時,先禁用外(wài)鍵檢查,等待表導入完成後,再打開(kāi)外(wài)鍵檢查。

    執行(xíng)load data操作時,關閉外(wài)鍵檢查,提高(gāo)性能。

    在一個有外(wài)鍵約束的表上執行(xíng)alter table改表。

    删除一個外(wài)鍵約束依賴的索引。

    創建一個外(wài)鍵約束,引用的表字段暫時還不(bù)存在。

    MySql    MySQL外(wài)鍵    

    頂一下
    (0)
    0.00%
    踩一下
    0
    0.00%
    加載中~

    Copyright © 2012-2024 世敏網絡 版權所有   京ICP證000000号    閩公網安備 35020502000640号        關鍵詞聚合

    世敏網絡

    您已成功複制(zhì)微(wēi)信号,去微(wēi)信立即添加好友!

    打開(kāi)微(wēi)信

    Wechart

    點擊下方複制(zhì)按鈕,複制(zhì)微(wēi)信号!

    jzm866081

    https://www.xmsmwl.cn
    廈門漳州市曙光網絡服務有限公司

    點擊這(zhè)裡(lǐ)聯系在線客服
    嘿!有什麽能幫到您的嗎(ma)?