<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
注意,MySQL 的 InnoDB 表引擎才支援外來鍵關聯,MyISAM 不支援。MySQL 還支援手動開啟或關閉外來鍵約束:SET FOREIGN_KEY_CHECKS = 0/1;。
使用外來鍵約束最大的好處在於 MySQL 幫助我們完成資料的一致性檢查。當我們使用預設的外來鍵型別 RESTRICT 時,在建立、修改或者刪除記錄時都會檢查參照的合法性。
假設我們的資料庫中包含 posts(id, author_id, content) 和 authors(id, name) 兩張表,在執行如下所示的操作時都會觸發資料庫對外來鍵的檢查:
向 posts 表中插入資料時,檢查 author_id 是否在 authors 表中存在;
修改 posts 表中的資料時,檢查 author_id 是否在 authors 表中存在;
刪除 authors 表中的資料時,檢查 posts 中是否存在參照當前記錄的外來鍵;
作為專門用於管理資料的系統,資料庫與應用服務相比能夠更好地保證完整性,而上述的這些操作都是引入外來鍵帶來的額外工作,不過這也是資料庫保證資料完整性的必要代價。上述的這些分析都是理論上的定性分析,我們其實可以簡單地定量分析一下引入外來鍵對效能的影響。
建立表時定義外來鍵(References,參照)
在 CREATE TABLE 語句中,通過 FOREIGN KEY 關鍵字來指定外來鍵,具體的語法格式如下:
[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(從表),建立外來鍵約束,讓 deptId 作為外來鍵關聯到 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:從表的外來鍵關聯的必須是主表的主鍵,且主鍵和外來鍵的資料型別必須一致。
以上語句執行成功之後,在表示 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)
外來鍵約束也可以在修改表時新增,但是新增外來鍵約束的前提是:從表中外來鍵列中的資料必須與主表中主鍵列中的資料一致或者是沒有資料。
在修改資料表時新增外來鍵約束的語法格式如下:
ALTER TABLE <資料表名> ADD CONSTRAINT <外來鍵名> FOREIGN KEY(<列名>) REFERENCES <主表名> (<列名>);
範例:修改資料表 tb_emp2,將欄位 deptId 設定為外來鍵,與資料表 tb_dept1 的主鍵 id 進行關聯。
# 建立 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_emp2G *************************** 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
當一個表中不需要外來鍵約束時,就需要從表中將其刪除。外來鍵一旦刪除,就會解除主表和從表之間的關聯關係。
刪除外來鍵約束的語法格式如下所示:
ALTER TABLE <表名> DROP FOREIGN KEY <外來鍵約束名>;
範例:刪除資料表 tb_emp2 中的外來鍵約束 fk_tb_dept1。
ALTER TABLE tb_emp2 DROP FOREIGN KEY fk_tb_dept1; MariaDB [test_db]> SHOW CREATE TABLE tb_emp2G *************************** 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
到此這篇關於MySQL外來鍵關聯操作的實現的文章就介紹到這了,更多相關MySQL外來鍵關聯操作內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45