搜尋
首頁資料庫mysql教程mysql支不支援外鍵
mysql支不支援外鍵Jun 27, 2022 pm 12:00 PM
mysql

mysql支援外鍵。在MySQL中,外鍵主要用來建立主表與從表的關聯關係,可以為兩個表的資料建立連接,約束兩個表中資料的一致性和完整性;當主表刪除某筆記錄時,從表中與之對應的記錄也必須有對應的改變。一個表可以有一個或多個外鍵,外鍵可以為空值,若不為空值,則每一個外鍵的值必須等於主表中主鍵的某個值;且外鍵中列的數目和對應資料類型必須和主表的主鍵中的相同。

mysql支不支援外鍵

本教學操作環境:windows7系統、mysql8版本、Dell G3電腦。

mysql支援外鍵。

MySQL外鍵(FOREIGN KEY)

#外鍵是指定表中與另一個資料表的另一個欄位相符的字段。外鍵對相關表中的資料設定了約束,這使MySQL能夠保持參照完整性。

外鍵用來建立主表與從表的關聯關係,為兩個表的資料建立連接,約束兩個表中資料的一致性和完整性。

對於兩個具有關聯關係的表而言,相關聯欄位中主鍵所在的表就是主表(父表),外鍵所在的表就是從表(子表)。

主表刪除某筆記錄時,從表中與之對應的記錄也必須有對應的改變。一個表可以有一個或多個外鍵,外鍵可以為空值,若不為空值,則每一個外鍵的值必須等於主表中主鍵的某個值。

我們來看看範例資料庫中的以下資料庫圖。

mysql支不支援外鍵

我們有兩個表格:customers和orders, 每個客戶都有零個或多個訂單,每個訂單只能屬於一個客戶。 customers表和orders表之間的關係是一對多的,它orders由customerNumber欄位指定的表中的外鍵建立。 customers表中的customerNumber欄位與orders表中的customerNumber主鍵欄位相關 。

customers 表稱為父表或引用表,orders表稱為子表或引用表。

外鍵可以是一個欄位或一組欄位。子表中的列通常會引用父表中的主鍵列。

表可以有多個外鍵,子表中的每個外鍵可以引用不同的父表。

子表中的行必須包含父表中存在的值,例如,orders表中的每個訂單記錄必須具有customers表customerNumber中存在的值。因此,多個訂單可以引用同一個客戶,這種關係稱為一個(客戶)到多個(訂單)或一對多。

有時,子表和父表是相同的。外鍵引用表的主鍵,例如,下employees表:

mysql支不支援外鍵

reportTo列是一個外鍵,它引用employeeNumber作為employees表的主鍵的列,以反映員工之間的報告結構,即每位員工向另一個員工報告,員工可以有零個或多個直接報告。我們有一個關於自聯接教程可以幫助您根據這種表查詢資料。

reportTo外鍵也被稱為遞歸或自引用的外鍵。

外鍵強制執行參考完整性,可協助您自動維護資料的一致性和完整性。例如,您無法為不存在的客戶建立訂單。

此外,您可以customerNumber在外鍵的刪除操作上設定級聯,以便在刪除customers表中的客戶時,也會刪除與客戶關聯的所有訂單。這節省了使用多個DELETE語句 或DELETE JOIN語句的時間和精力。

與刪除相同,您也可以在更新作業上為customerNumber外鍵定義級聯,以便在不使用多個UPDATE語句或UPDATE JOIN語句的情況下執行跨表更新。

注意:在MySQL中,InnoDB 儲存引擎支援外鍵,因此您必須建立InnoDB表才能使用外鍵約束。

mysql定義外鍵時,需要遵守下列規則:

  • 主表必須已經存在於資料庫中,或是目前正在建立的表。如果是後一種情況,則主表與從表是同一個表,這樣的表稱為自參照表,這種結構稱為自參照完整性。

  • 必須為主表定義主鍵。

  • 主鍵不能包含空值,但允許在外鍵中出現空值。也就是說,只要外鍵的每個非空值出現在指定的主鍵中,這個外鍵的內容就是正確的。

  • 在主表的表名後面指定列名或列名的組合。這個列或列的組合必須是主表的主鍵或候選鍵。

  • 外鍵中列的數目必須和主表的主鍵中列的數目相同。

  • 外鍵中列的資料型別必須和主表主鍵中對應列的資料型別相同。

為表建立外鍵

#MySQL建立外鍵語法

以下語法說明如何在CREATE TABLE語句中的子表中定義外鍵。

CONSTRAINT constraint_name
FOREIGN KEY foreign_key_name (columns)
REFERENCES parent_table(columns)
ON DELETE action
ON UPDATE action

讓我們更詳細地學習語法:

  • CONSTRAINT子句允許您為外鍵約束定義約束名稱。如果省略它,MySQL將自動產生一個名稱。

  • FOREIGN KEY子句指定子表中引用父表中主鍵列的欄位。你可以把一個外鍵名稱放在FOREIGN KEY子句之後,或是請MySQL為你建立一個名字。請注意,MySQL會自動使用foreign_key_name名稱建立索引。

  • REFERENCES子句指定子表中的欄位所引用的父表及列。在規定的子表和父表的列數FOREIGN KEY和REFERENCES必須相同。

  • ON DELETE子句可讓您定義刪除父表中的記錄時子表中記錄的內容。如果省略ON DELETE子句並刪除父表中包含子表中記錄的記錄,MySQL將拒絕刪除。此外,MySQL還為您提供操作,以便您可以使用其他選項,例如ON DELETE CASCADE  ,要求MySQL刪除子表中的記錄,當父表中的記錄被刪除時,記錄將引用父表中的記錄。如果您不希望刪除子表中的相關記錄,請改用ON DELETE SET NULL操作。 MySQL會將子表中的外鍵列值設定為NULL刪除父表中的記錄時,條件是子表中的外鍵列必須接受NULL值。請注意,如果您使用ON DELETE NO ACTION或ON DELETE RESTRICT操作,MySQL將拒絕刪除。

  • ON UPDATE子句可讓您指定更新父表中的行時子表中的行會發生什麼。您可以省略ON UPDATE子句,以便在更新父表中的行時讓MySQL拒絕對子表中行的任何更新。 ON UPDATE CASCADE操作可讓您執行跨表更新,並且當更新父表ON UPDATE SET NULL中的行時,操作會將子表中的行中的值重設為值NULL。 ON UPDATE NO ACTION或UPDATE RESTRICT行動拒絕任何更新。

MySQL建立表外鍵範例

#下面的範例建立一個dbdemo資料庫和兩個表:categories和  products.每個類別具有一個或多個產品和每個產品只屬於一個類別。 products表中的cat_id欄位被定義為帶有UPDATE ON CASCADE和DELETE ON RESTRICT操作的外鍵。

CREATE DATABASE IF NOT EXISTS dbdemo;
 
USE dbdemo;
 
CREATE TABLE categories(
   cat_id int not null auto_increment primary key,
   cat_name varchar(255) not null,
   cat_description text
) ENGINE=InnoDB;
 
CREATE TABLE products(
   prd_id int not null auto_increment primary key,
   prd_name varchar(355) not null,
   prd_price decimal,
   cat_id int not null,
   FOREIGN KEY fk_cat(cat_id)
   REFERENCES categories(cat_id)
   ON UPDATE CASCADE
   ON DELETE RESTRICT
)ENGINE=InnoDB;

將外鍵加入表中

#MySQL新增外鍵語法

要將外鍵新增至現有表,請使用具有上述外鍵定義語法的ALTER TABLE語句:

ALTER TABLE table_name
ADD CONSTRAINT constraint_name
FOREIGN KEY foreign_key_name(columns)
REFERENCES parent_table(columns)
ON DELETE action
ON UPDATE action;

MySQL新增外鍵範例

現在,讓我們新增一個名為vendors的新表,並更改products表以包含供應商ID欄位:

USE dbdemo;
 
CREATE TABLE vendors(
    vdr_id int not null auto_increment primary key,
    vdr_name varchar(255)
)ENGINE=InnoDB;
 
ALTER TABLE products 
ADD COLUMN vdr_id int not null AFTER cat_id;

要新增外鍵products,請使用以下語句:

ALTER TABLE products
ADD FOREIGN KEY fk_vendor(vdr_id)
REFERENCES vendors(vdr_id)
ON DELETE NO ACTION
ON UPDATE CASCADE;

mysql支不支援外鍵現在,products表有兩個外鍵,一個引用categories表,另一個引用vendors表。

【相關推薦:mysql影片教學

#

以上是mysql支不支援外鍵的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
图文详解mysql架构原理图文详解mysql架构原理May 17, 2022 pm 05:54 PM

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了关于架构原理的相关内容,MySQL Server架构自顶向下大致可以分网络连接层、服务层、存储引擎层和系统文件层,下面一起来看一下,希望对大家有帮助。

mysql怎么替换换行符mysql怎么替换换行符Apr 18, 2022 pm 03:14 PM

在mysql中,可以利用char()和REPLACE()函数来替换换行符;REPLACE()函数可以用新字符串替换列中的换行符,而换行符可使用“char(13)”来表示,语法为“replace(字段名,char(13),'新字符串') ”。

mysql怎么去掉第一个字符mysql怎么去掉第一个字符May 19, 2022 am 10:21 AM

方法:1、利用right函数,语法为“update 表名 set 指定字段 = right(指定字段, length(指定字段)-1)...”;2、利用substring函数,语法为“select substring(指定字段,2)..”。

mysql的msi与zip版本有什么区别mysql的msi与zip版本有什么区别May 16, 2022 pm 04:33 PM

mysql的msi与zip版本的区别:1、zip包含的安装程序是一种主动安装,而msi包含的是被installer所用的安装文件以提交请求的方式安装;2、zip是一种数据压缩和文档存储的文件格式,msi是微软格式的安装包。

mysql怎么将varchar转换为int类型mysql怎么将varchar转换为int类型May 12, 2022 pm 04:51 PM

转换方法:1、利用cast函数,语法“select * from 表名 order by cast(字段名 as SIGNED)”;2、利用“select * from 表名 order by CONVERT(字段名,SIGNED)”语句。

MySQL复制技术之异步复制和半同步复制MySQL复制技术之异步复制和半同步复制Apr 25, 2022 pm 07:21 PM

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了关于MySQL复制技术的相关问题,包括了异步复制、半同步复制等等内容,下面一起来看一下,希望对大家有帮助。

带你把MySQL索引吃透了带你把MySQL索引吃透了Apr 22, 2022 am 11:48 AM

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了mysql高级篇的一些问题,包括了索引是什么、索引底层实现等等问题,下面一起来看一下,希望对大家有帮助。

mysql怎么判断是否是数字类型mysql怎么判断是否是数字类型May 16, 2022 am 10:09 AM

在mysql中,可以利用REGEXP运算符判断数据是否是数字类型,语法为“String REGEXP '[^0-9.]'”;该运算符是正则表达式的缩写,若数据字符中含有数字时,返回的结果是true,反之返回的结果是false。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前By尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
1 個月前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境