最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL外鍵約束(FOREIGN KEY)的具體使用

 更新時(shí)間:2024年05月06日 10:22:46   作者:Itmastergo  
MySQL外鍵約束是表的一個(gè)特殊字段,經(jīng)常與主鍵約束一起使用,本文主要介紹了MySQL外鍵約束(FOREIGN KEY)的具體使用,具有一定的參考價(jià)值,感興趣的可以了解一下

MySQL 外鍵約束(FOREIGN KEY)是表的一個(gè)特殊字段,經(jīng)常與主鍵約束一起使用。對(duì)于兩個(gè)具有關(guān)聯(lián)關(guān)系的表而言,相關(guān)聯(lián)字段中主鍵所在的表就是主表(父表),外鍵所在的表就是從表(子表)。

外鍵用來建立主表與從表的關(guān)聯(lián)關(guān)系,為兩個(gè)表的數(shù)據(jù)建立連接,約束兩個(gè)表中數(shù)據(jù)的一致性和完整性。比如,一個(gè)水果攤,只有蘋果、桃子、李子、西瓜等 4 種水果,那么,你來到水果攤要買水果就只能選擇蘋果、桃子、李子和西瓜,其它的水果都是不能購(gòu)買的。

主表刪除某條記錄時(shí),從表中與之對(duì)應(yīng)的記錄也必須有相應(yīng)的改變。一個(gè)表可以有一個(gè)或多個(gè)外鍵,外鍵可以為空值,若不為空值,則每一個(gè)外鍵的值必須等于主表中主鍵的某個(gè)值。

定義外鍵時(shí),需要遵守下列規(guī)則:

  • 主表必須已經(jīng)存在于數(shù)據(jù)庫(kù)中,或者是當(dāng)前正在創(chuàng)建的表。如果是后一種情況,則主表與從表是同一個(gè)表,這樣的表稱為自參照表,這種結(jié)構(gòu)稱為自參照完整性。
  • 必須為主表定義主鍵。
  • 主鍵不能包含空值,但允許在外鍵中出現(xiàn)空值。也就是說,只要外鍵的每個(gè)非空值出現(xiàn)在指定的主鍵中,這個(gè)外鍵的內(nèi)容就是正確的。
  • 在主表的表名后面指定列名或列名的組合。這個(gè)列或列的組合必須是主表的主鍵或候選鍵。
  • 外鍵中列的數(shù)目必須和主表的主鍵中列的數(shù)目相同。
  • 外鍵中列的數(shù)據(jù)類型必須和主表主鍵中對(duì)應(yīng)列的數(shù)據(jù)類型相同。

在創(chuàng)建表時(shí)設(shè)置外鍵約束

在 CREATE TABLE 語句中,通過 FOREIGN KEY 關(guān)鍵字來指定外鍵,具體的語法格式如下:

[CONSTRAINT <外鍵名>] FOREIGN KEY 字段名 [,字段名2,…]
REFERENCES <主表名> 主鍵列1 [,主鍵列2,…]

例 1

為了展現(xiàn)表與表之間的外鍵關(guān)系,本例在 test_db 數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)部門表 tb_dept1,表結(jié)構(gòu)如下表所示:

字段名稱數(shù)據(jù)類型備注
idINT(11)部門編號(hào)
nameVARCHAR(22)部門名稱
locationVARCHAR(22)部門位置

創(chuàng)建 tb_dept1 的 SQL 語句和運(yùn)行結(jié)果如下所示。

mysql> CREATE TABLE tb_dept1
    -> (
    -> id INT(11) PRIMARY KEY,
    -> name VARCHAR(22) NOT NULL,
    -> location VARCHAR(50)
    -> );
Query OK, 0 rows affected (0.37 sec)

創(chuàng)建數(shù)據(jù)表 tb_emp6,并在表 tb_emp6 上創(chuàng)建外鍵約束,讓它的鍵 deptId 作為外鍵關(guān)聯(lián)到表 tb_dept1 的主鍵 id,SQL 語句和運(yùn)行結(jié)果如下所示:

mysql> CREATE TABLE tb_emp6
    -> (
    -> id INT(11) PRIMARY KEY,
    -> name VARCHAR(25),
    -> deptId INT(11),
    -> salary FLOAT,
    -> CONSTRAINT fk_emp_dept1
    -> FOREIGN KEY(deptId) REFERENCES tb_dept1(id)
    -> );
Query OK, 0 rows affected (0.37 sec)

mysql> DESC tb_emp6;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id     | int(11)     | NO   | PRI | NULL    |       |
| name   | varchar(25) | YES  |     | NULL    |       |
| deptId | int(11)     | YES  | MUL | NULL    |       |
| salary | float       | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
4 rows in set (1.33 sec)

以上語句執(zhí)行成功之后,在表 tb_emp6 上添加了名稱為 fk_emp_dept1 的外鍵約束,外鍵名稱為 deptId,其依賴于表 tb_dept1 的主鍵 id。

注意:從表的外鍵關(guān)聯(lián)的必須是主表的主鍵,且主鍵和外鍵的數(shù)據(jù)類型必須一致。例如,兩者都是 INT 類型,或者都是 CHAR 類型。如果不滿足這樣的要求,在創(chuàng)建從表時(shí),就會(huì)出現(xiàn)“ERROR 1005(HY000): Can't create table”錯(cuò)誤。

在修改表時(shí)添加外鍵約束

外鍵約束也可以在修改表時(shí)添加,但是添加外鍵約束的前提是:從表中外鍵列中的數(shù)據(jù)必須與主表中主鍵列中的數(shù)據(jù)一致或者是沒有數(shù)據(jù)。

在修改數(shù)據(jù)表時(shí)添加外鍵約束的語法格式如下:

ALTER TABLE <數(shù)據(jù)表名> ADD CONSTRAINT <外鍵名>
FOREIGN KEY(<列名>) REFERENCES <主表名> (<列名>);

例 2

修改數(shù)據(jù)表 tb_emp2,將字段 deptId 設(shè)置為外鍵,與數(shù)據(jù)表 tb_dept1 的主鍵 id 進(jìn)行關(guān)聯(lián),SQL 語句和運(yùn)行結(jié)果如下所示:

mysql> ALTER TABLE tb_emp2
    -> ADD CONSTRAINT fk_tb_dept1
    -> FOREIGN KEY(deptId)
    -> REFERENCES tb_dept1(id);
Query OK, 0 rows affected (1.38 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> SHOW CREATE TABLE tb_emp2\G
*************************** 1. row ***************************
       Table: tb_emp2
Create Table: CREATE TABLE `tb_emp2` (
  `id` int(11) NOT NULL,
  `name` varchar(30) DEFAULT NULL,
  `deptId` int(11) DEFAULT NULL,
  `salary` float DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `fk_tb_dept1` (`deptId`),
  CONSTRAINT `fk_tb_dept1` FOREIGN KEY (`deptId`) REFERENCES `tb_dept1` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312
1 row in set (0.12 sec)

注意:在為已經(jīng)創(chuàng)建好的數(shù)據(jù)表添加外鍵約束時(shí),要確保添加外鍵約束的列的值全部來源于主鍵列,并且外鍵列不能為空。

刪除外鍵約束

當(dāng)一個(gè)表中不需要外鍵約束時(shí),就需要從表中將其刪除。外鍵一旦刪除,就會(huì)解除主表和從表間的關(guān)聯(lián)關(guān)系。

刪除外鍵約束的語法格式如下所示:

ALTER TABLE <表名> DROP FOREIGN KEY <外鍵約束名>;

例 3

刪除數(shù)據(jù)表 tb_emp2 中的外鍵約束 fk_tb_dept1,SQL 語句和運(yùn)行結(jié)果如下所示。

mysql> ALTER TABLE tb_emp2
    -> DROP FOREIGN KEY fk_tb_dept1;
Query OK, 0 rows affected (0.19 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> SHOW CREATE TABLE tb_emp2\G
*************************** 1. row ***************************
       Table: tb_emp2
Create Table: CREATE TABLE `tb_emp2` (
  `id` int(11) NOT NULL,
  `name` varchar(30) DEFAULT NULL,
  `deptId` int(11) DEFAULT NULL,
  `salary` float DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `fk_tb_dept1` (`deptId`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312
1 row in set (0.00 sec)

可以看到,tb_emp2 中已經(jīng)不存在 FOREIGN KEY,原有的名稱為 fk_emp_dept 的外鍵約束刪除成功。

到此這篇關(guān)于MySQL外鍵約束(FOREIGN KEY)的具體使用的文章就介紹到這了,更多相關(guān)MySQL外鍵約束內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 深入分析MySQL Sending data查詢慢問題

    深入分析MySQL Sending data查詢慢問題

    給大家深入分析一下MySQL Sending data表查詢慢的問題,并給出了詳細(xì)的解決方案,一起來參考下。
    2017-12-12
  • MySQL 如何分析查詢性能

    MySQL 如何分析查詢性能

    這篇文章主要介紹了MySQL 如何分析查詢性能,幫助大家更好的理解和學(xué)習(xí)使用MySQL,感興趣的朋友可以了解下
    2021-05-05
  • mysql enum字段類型的謹(jǐn)慎使用

    mysql enum字段類型的謹(jǐn)慎使用

    本文主要介紹了mysql enum字段類型使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • mac下安裝mysql忘記密碼的修改方法

    mac下安裝mysql忘記密碼的修改方法

    這篇文章主要介紹了mac下安裝mysql忘記密碼的修改方法,需要的朋友可以參考下
    2017-06-06
  • MySQL系列之十 MySQL事務(wù)隔離實(shí)現(xiàn)并發(fā)控制

    MySQL系列之十 MySQL事務(wù)隔離實(shí)現(xiàn)并發(fā)控制

    今天的內(nèi)容就和大家聊一聊MySQL數(shù)據(jù)庫(kù)中關(guān)于MySQL事務(wù)隔離實(shí)現(xiàn)并發(fā)控制的問題,主要是基于鎖實(shí)現(xiàn)控制技術(shù)
    2021-07-07
  • mysql慢查詢操作實(shí)例分析【開啟、測(cè)試、確認(rèn)等】

    mysql慢查詢操作實(shí)例分析【開啟、測(cè)試、確認(rèn)等】

    這篇文章主要介紹了mysql慢查詢操作,結(jié)合實(shí)例形式分析了mysql慢查詢操作中的開啟、測(cè)試、確認(rèn)等實(shí)現(xiàn)方法及相關(guān)操作技巧,需要的朋友可以參考下
    2019-12-12
  • MySQL數(shù)據(jù)庫(kù)中如何查詢近一年的數(shù)據(jù)

    MySQL數(shù)據(jù)庫(kù)中如何查詢近一年的數(shù)據(jù)

    最近碰到一個(gè)需求是統(tǒng)計(jì)某張表的數(shù)據(jù),統(tǒng)計(jì)時(shí)間維度為近一年,下面這篇文章主要給大家介紹了關(guān)于MySQL數(shù)據(jù)庫(kù)中如何查詢近一年的數(shù)據(jù)的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-07-07
  • Linux上通過binlog文件恢復(fù)mysql數(shù)據(jù)庫(kù)詳細(xì)步驟

    Linux上通過binlog文件恢復(fù)mysql數(shù)據(jù)庫(kù)詳細(xì)步驟

    binglog文件是服務(wù)器的二進(jìn)制日志記錄著該數(shù)據(jù)庫(kù)的所有增刪改的操作日志,接下來通過本文給大家介紹linux上通過binlog文件恢復(fù)mysql數(shù)據(jù)庫(kù)詳細(xì)步驟,非常不錯(cuò),需要的朋友參考下
    2016-08-08
  • 使用MySQL的geometry類型處理經(jīng)緯度距離問題的方法

    使用MySQL的geometry類型處理經(jīng)緯度距離問題的方法

    這篇文章主要介紹了使用MySQL的geometry類型處理經(jīng)緯度距離問題的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-01-01
  • MySQL復(fù)合查詢和表的內(nèi)外連接示例詳解

    MySQL復(fù)合查詢和表的內(nèi)外連接示例詳解

    在數(shù)據(jù)庫(kù)管理和數(shù)據(jù)分析中,單表查詢往往無法滿足復(fù)雜的數(shù)據(jù)查詢需求,因此多表查詢和子查詢成為了解決問題的關(guān)鍵技術(shù),MySQL支持多種多表查詢方式,如內(nèi)連接、外連接(左外連接和右外連接)以及自連接,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-10-10

最新評(píng)論

岢岚县| 鲜城| 雅江县| 商丘市| 光泽县| 广南县| 蒙阴县| 连江县| 濮阳县| 惠安县| 平远县| 丹凤县| 呼伦贝尔市| 买车| 余姚市| 全南县| 繁峙县| 图木舒克市| 榆社县| 陈巴尔虎旗| 牡丹江市| 衡水市| 盐边县| 稷山县| 洪洞县| 二手房| 昌黎县| 甘谷县| 静安区| 科技| 安泽县| 车致| 庆城县| 沾益县| 丹寨县| 徐水县| 郧西县| 潍坊市| 岫岩| 阆中市| 凤冈县|