欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL外鍵關(guān)聯(lián)操作的實(shí)現(xiàn)

 更新時(shí)間:2022年07月28日 16:04:03   作者:那只斑馬不睡覺  
本文主要介紹了MySQL外鍵關(guān)聯(lián)操作的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

MySQL 的外鍵約束

注意,MySQL 的 InnoDB 表引擎才支持外鍵關(guān)聯(lián),MyISAM 不支持。MySQL 還支持手動打開或關(guān)閉外鍵約束:SET FOREIGN_KEY_CHECKS = 0/1;。

使用外鍵約束最大的好處在于 MySQL 幫助我們完成數(shù)據(jù)的一致性檢查。當(dāng)我們使用默認(rèn)的外鍵類型 RESTRICT 時(shí),在創(chuàng)建、修改或者刪除記錄時(shí)都會檢查引用的合法性。

假設(shè)我們的數(shù)據(jù)庫中包含 posts(id, author_id, content) 和 authors(id, name) 兩張表,在執(zhí)行如下所示的操作時(shí)都會觸發(fā)數(shù)據(jù)庫對外鍵的檢查:

向 posts 表中插入數(shù)據(jù)時(shí),檢查 author_id 是否在 authors 表中存在;

修改 posts 表中的數(shù)據(jù)時(shí),檢查 author_id 是否在 authors 表中存在;

刪除 authors 表中的數(shù)據(jù)時(shí),檢查 posts 中是否存在引用當(dāng)前記錄的外鍵;

作為專門用于管理數(shù)據(jù)的系統(tǒng),數(shù)據(jù)庫與應(yīng)用服務(wù)相比能夠更好地保證完整性,而上述的這些操作都是引入外鍵帶來的額外工作,不過這也是數(shù)據(jù)庫保證數(shù)據(jù)完整性的必要代價(jià)。上述的這些分析都是理論上的定性分析,我們其實(shí)可以簡單地定量分析一下引入外鍵對性能的影響。

創(chuàng)建表時(shí)定義外鍵(References,參照)

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

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

示例:

# 部門表 tb_dept1(主表)
CREATE TABLE tb_dept1
(
    id INT(11) PRIMARY KEY,
    name VARCHAR(22) NOT NULL,
    location VARCHAR(50)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312;
 
# 員工表 tb_emp6(從表),創(chuàng)建外鍵約束,讓 deptId 作為外鍵關(guān)聯(lián)到 tb_dept1 的主鍵 id。
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)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312;

NOTE:從表的外鍵關(guān)聯(lián)的必須是主表的主鍵,且主鍵和外鍵的數(shù)據(jù)類型必須一致。

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

查看主表的約束信息

MariaDB [test_db]> select * from INFORMATION_SCHEMA.KEY_COLUMN_USAGE where REFERENCED_TABLE_NAME='tb_dept1'\G;
*************************** 1. row ***************************
           CONSTRAINT_CATALOG: def
            CONSTRAINT_SCHEMA: test_db
              CONSTRAINT_NAME: fk_emp_dept1
                TABLE_CATALOG: def
                 TABLE_SCHEMA: test_db
                   TABLE_NAME: tb_emp6
                  COLUMN_NAME: deptId
             ORDINAL_POSITION: 1
POSITION_IN_UNIQUE_CONSTRAINT: 1
      REFERENCED_TABLE_SCHEMA: test_db
        REFERENCED_TABLE_NAME: tb_dept1
       REFERENCED_COLUMN_NAME: id
1 row in set (0.00 sec)

修改原有表的外鍵約束

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

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

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

示例:修改數(shù)據(jù)表 tb_emp2,將字段 deptId 設(shè)置為外鍵,與數(shù)據(jù)表 tb_dept1 的主鍵 id 進(jìn)行關(guān)聯(lián)。

# 創(chuàng)建 tb_emp2(從表)
CREATE TABLE tb_emp2
(
    id INT(11) PRIMARY KEY,
    name VARCHAR(25),
    deptId INT(11),
    salary FLOAT
) ENGINE=InnoDB DEFAULT CHARSET=gb2312;
 
MariaDB [test_db]> desc tb_emp2;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id     | int(11)     | NO   | PRI | NULL    |       |
| name   | varchar(25) | YES  |     | NULL    |       |
| deptId | int(11)     | YES  |     | NULL    |       |
| salary | float       | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
 
# 添加外鍵約束
ALTER TABLE tb_emp2 ADD CONSTRAINT fk_tb_dept1 FOREIGN KEY(deptId) REFERENCES tb_dept1(id);
 
MariaDB [test_db]> desc tb_emp2;
+--------+-------------+------+-----+---------+-------+
| 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    |       |
+--------+-------------+------+-----+---------+-------+
 
MariaDB [test_db]> SHOW CREATE TABLE tb_emp2\G
*************************** 1. row ***************************
       Table: tb_emp2
Create Table: CREATE TABLE `tb_emp2` (
  `id` int(11) NOT NULL,
  `name` varchar(25) 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

刪除外鍵約束

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

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

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

示例:刪除數(shù)據(jù)表 tb_emp2 中的外鍵約束 fk_tb_dept1。

ALTER TABLE tb_emp2 DROP FOREIGN KEY fk_tb_dept1;
 
MariaDB [test_db]> SHOW CREATE TABLE tb_emp2\G
*************************** 1. row ***************************
       Table: tb_emp2
Create Table: CREATE TABLE `tb_emp2` (
  `id` int(11) NOT NULL,
  `name` varchar(25) DEFAULT NULL,
  `deptId` int(11) DEFAULT NULL,
  `salary` float DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `fk_tb_dept1` (`deptId`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312

到此這篇關(guān)于MySQL外鍵關(guān)聯(lián)操作的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)MySQL外鍵關(guān)聯(lián)操作內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mysql去重查詢的三種方法小結(jié)

    mysql去重查詢的三種方法小結(jié)

    本文主要介紹了mysql去重查詢的三種方法小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • centos7.2下安裝mysql5.7數(shù)據(jù)庫的命令詳解

    centos7.2下安裝mysql5.7數(shù)據(jù)庫的命令詳解

    這篇文章主要介紹了centos7.2下安裝mysql5.7數(shù)據(jù)庫,文中給出了所有的命令,按照命令執(zhí)行就會安裝上 ,需要的朋友可以參考下
    2019-07-07
  • 一文帶你理解MySql中explain結(jié)果filtered

    一文帶你理解MySql中explain結(jié)果filtered

    使用EXPLAIN關(guān)鍵字可以模擬優(yōu)化器執(zhí)行SQL查詢語句,從而知道MySQL是如何處理你的SQL語句的,下面這篇文章主要給大家介紹了關(guān)于MySql中explain結(jié)果filtered的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • MYSQL如何查看進(jìn)程和kill進(jìn)程

    MYSQL如何查看進(jìn)程和kill進(jìn)程

    這篇文章主要介紹了MYSQL如何查看進(jìn)程和kill進(jìn)程,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Mysql查詢以某"字符串"開頭的查詢方式

    Mysql查詢以某"字符串"開頭的查詢方式

    這篇文章主要介紹了Mysql查詢以某"字符串"開頭的查詢方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • MySQL 設(shè)計(jì)和命令行模式下建立詳解

    MySQL 設(shè)計(jì)和命令行模式下建立詳解

    這篇文章主要介紹了MySQL 設(shè)計(jì)和命令行模式下建立詳解的相關(guān)資料,主要講解了數(shù)據(jù)庫的建立與數(shù)據(jù)表的設(shè)計(jì),需要的朋友可以參考下
    2017-01-01
  • MySQL無法啟動的解決辦法

    MySQL無法啟動的解決辦法

    這篇文章主要介紹了MySQL無法啟動的解決辦法的相關(guān)資料,希望通過本文大家能解決數(shù)據(jù)庫不能啟動的問題,需要的朋友可以參考下
    2017-09-09
  • 利用phpmyadmin設(shè)置mysql的權(quán)限方法

    利用phpmyadmin設(shè)置mysql的權(quán)限方法

    這篇文章主要介紹了如何利用phpmyadmin設(shè)置mysql的權(quán)限方法,需要的朋友可以參考下
    2018-03-03
  • MySQL數(shù)據(jù)庫改名的詳細(xì)方法教程

    MySQL數(shù)據(jù)庫改名的詳細(xì)方法教程

    在很多人看來Oracle數(shù)據(jù)庫一旦建好后,數(shù)據(jù)庫的名字就不能改變了,其實(shí)不然,下面這篇文章主要給大家介紹了關(guān)于MySQL數(shù)據(jù)庫改名的相關(guān)資料,需要的朋友可以參考下
    2023-03-03
  • Mysql中distinct與group by的去重方面的區(qū)別

    Mysql中distinct與group by的去重方面的區(qū)別

    distinct簡單來說就是用來去重的,而group by的設(shè)計(jì)目的則是用來聚合統(tǒng)計(jì)的,兩者在能夠?qū)崿F(xiàn)的功能上有些相同之處,但應(yīng)該仔細(xì)區(qū)分,因?yàn)橛缅e場景的話,效率相差可以倍計(jì)。
    2020-03-03

最新評論