外鍵約束RESTRICT和NO ACTION有何不同?MySQL外鍵詳解
一、建立外鍵約束
語法如下:
[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
1. CONSTRAINT [symbol]]指定約束名字,不寫則系統(tǒng)自動(dòng)生成外鍵約束名;
2. MySQL強(qiáng)制外鍵約束的列上必須要有索引, [index_name]指定索引名,不寫則系統(tǒng)自動(dòng)生成索引名,如果已經(jīng)存在可以用于支持外鍵約束的索引,那么指定的索引名則無效,采用已有的索引;
3. [ON DELETE reference_option]和[ON UPDATE reference_option]指定主表update和delete操作時(shí),子表對應(yīng)的數(shù)據(jù)怎么響應(yīng);
建立外鍵約束例子如:
create table tab1 (id int primary key); create table tab2 ( id int primary key, col1 int, foreign key (col1) references tab1(id) );
下面看一下[ON DELETE reference_option]和[ON UPDATE reference_option]的reference_option都有哪些參數(shù):
1.CASCADE,級聯(lián)刪除/級聯(lián)更新,即主表delete或update了被其他表引用的數(shù)據(jù),對應(yīng)子表的數(shù)據(jù)也被delte或update;
2.SET NULL,當(dāng)主表delete或update了被其他表引用的數(shù)據(jù),對應(yīng)子表的數(shù)據(jù)被設(shè)為null,注意子表的外鍵不能設(shè)為not null;
3.RESTRICT,主表不允許delete或update被其他表引用的數(shù)據(jù);當(dāng)沒有指定任何[ON DELETE reference_option]和[ON UPDATE reference_option],默認(rèn)是采用RESTRICT;
4.NO ACTION,在MySQL中,等效于RESTRICT;
5.SET DEFAULT,InnoDB和NDB中無法使用該參數(shù)。
二、添加外鍵約束
語法如下:
ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (col_name, ...) REFERENCES tbl_name (col_name,...) [ON DELETE reference_option] [ON UPDATE reference_option]
基本的語法參數(shù)在上文已經(jīng)解釋了。
三、刪除外鍵約束
語法如下:
ALTER TABLE tbl_name DROP FOREIGN KEY fk_symbol;
fk_symbol即外鍵約束名,如果不知道具體是什么,可以使用show create table tab_name\G來查看。
四、外鍵約束注意事項(xiàng)
1.外鍵上無法插入主表沒有的數(shù)據(jù),也無法更新為主表沒有的數(shù)據(jù);
2.外鍵上必須要有索引,主表上對應(yīng)的列最好也創(chuàng)建索引,因?yàn)楫?dāng)子表外鍵插入數(shù)據(jù)時(shí),也是需要到主表對應(yīng)的列上去檢查數(shù)據(jù)是否存在,有索引可以提高效率;
3.如果一個(gè)表被其他表的外鍵引用,則這個(gè)表無法被刪除;如果通過set foreign_key_checks=0強(qiáng)制刪除主表,則子表無法插入任何數(shù)據(jù);
4.外鍵的字段類型,字符集必須要跟引用的字段一致,unsigned屬性也要一致,否則無法創(chuàng)建外鍵約束;
5.被引用的列上必須要有索引,否則無法創(chuàng)建外鍵約束。
五、總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
MySQL中DISTINCT語句去重優(yōu)化機(jī)制詳解
本文深入解析了SQL中DISTINCT的優(yōu)化機(jī)制,介紹了內(nèi)SQL內(nèi)內(nèi)核如何自動(dòng)將DISTINCT改寫為GROUPBY或LIMIT以提高查詢效率,通過具體案例展示了優(yōu)化器如何通過語義推理確定目標(biāo)列是否被常量固定,從而實(shí)現(xiàn)高效去重2026-06-06
Mysql 5.5.56版本(二進(jìn)制包安裝)自定義安裝路徑步驟記錄
這篇文章主要介紹了Mysql 5.5.56版本(二進(jìn)制包安裝)自定義安裝路徑步驟記錄,需要的朋友可以參考下2017-07-07
MySQL實(shí)現(xiàn)批量插入測試數(shù)據(jù)的方式小結(jié)
在開發(fā)過程中我們不管是用來測試性能還是在生產(chǎn)環(huán)境中頁面展示好看一點(diǎn),?經(jīng)常需要一些測試數(shù)據(jù),?本文主要介紹了兩種常用的MySQL測試數(shù)據(jù)批量生成方式,希望對大家有所幫助2023-11-11
MYSQL 性能分析器 EXPLAIN 用法實(shí)例分析
這篇文章主要介紹了MYSQL 性能分析器 EXPLAIN 用法,結(jié)合實(shí)例形式分析了MYSQL 性能分析器 EXPLAIN 基本功能、使用方法及操作注意事項(xiàng),需要的朋友可以參考下2020-05-05
MySQL定期分析檢查與優(yōu)化表的方法小結(jié)
聽DBA的人說,相比oracle,MySQL就是一個(gè)玩具級別的數(shù)據(jù)庫,在網(wǎng)易門戶中,DBA基本很少去管理到MySQL的東西,所以我們產(chǎn)品使用到的MySQL的一些配置和優(yōu)化還是需要我們開發(fā)人員自己動(dòng)手,下面就簡單介紹一下實(shí)用的定期優(yōu)化方法2014-06-06
mysql滑動(dòng)訂單問題原理與解決方法實(shí)例分析
這篇文章主要介紹了mysql滑動(dòng)訂單問題原理與解決方法,結(jié)合實(shí)例形式分析了mysql滑動(dòng)訂單的問題的基本原理、解決方法與相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-12-12

