時間(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ù)存在。
RELATED RECOMMEND
2024-04-21
常用命令:啓動MySQL服務:net start mysql停止MySQL服務:net stop mysql登錄數據庫:mysql -u db_name -p“-u”表示用戶名“-p”表示密碼“–h localhost”可(kě)省略“-h”表示服務器名,localhost指本機“-P 3306”表示默認端口号,可(kě)省略退出數據庫exitquit\q顯示當前服務器版本:SELECT VERSION();顯示
2024-04-21
1、什麽是(shì)PDO? php data object ,php數據對象,PHP 數據對象 (PDO) 擴展爲PHP操作多(duō)種數據庫定義了一個輕量級的一緻接口。實現(xiàn) PDO 接口的每個數據庫驅動可(kě)以公開(kāi)具體(tǐ)數據庫的特性作爲标準擴展功能。 注意利用 PDO 擴展自(zì)身并不(bù)能實現(xiàn)任何數據庫功能;必須使用一個 具體(tǐ)數據庫的 PDO 驅動 來(lái)訪問(wèn)數據庫服務。PDO 提供了一個 數據訪問(wèn) 抽象層,這(zhè)意味着,不(bù)管使用
2024-04-21
PHP通(tōng)過mysqli連接mysql數據庫數據庫連接的天龍八步:1、連接數據庫連接:mysqli_connect2、成功與否判斷連接錯誤号:mysqli_connect_errno連接錯誤信息:mysqli_connect_error3、選擇數據庫選擇庫:mysqli_select_db執行(xíng)錯誤号:mysqli_errno執行(xíng)錯誤信息:mysqli_error4、設置字符集mysqli_set_c
Copyright © 2012-2024 世敏網絡 版權所有 京ICP證000000号 閩公網安備 35020502000640号 關鍵詞聚合