詳細說明可以百度搜我的博客: mysql foreign外鍵詳細使用方法和使用事項_2018_lcf
我們擁有十多年網(wǎng)頁設(shè)計和網(wǎng)站建設(shè)經(jīng)驗,從網(wǎng)站策劃到網(wǎng)站制作,我們的網(wǎng)頁設(shè)計師為您提供的解決方案。為企業(yè)提供成都網(wǎng)站建設(shè)、成都網(wǎng)站制作、微信開發(fā)、微信平臺小程序開發(fā)、移動網(wǎng)站建設(shè)、H5網(wǎng)站設(shè)計、等業(yè)務(wù)。無論您有什么樣的網(wǎng)站設(shè)計或者設(shè)計方案要求,我們都將富于創(chuàng)造性的提供專業(yè)設(shè)計服務(wù)并滿足您的需求。
---------下面是使用方法
使用外鍵的前提:
1. 表儲存引擎必須是innodb,否則創(chuàng)建的外鍵無約束效果。
2. 外鍵的列類型必須與父表的主鍵類型完全一致。
3. 外鍵的名字不能重復(fù)(一般使用。
建外鍵表兩種方式(創(chuàng)建表時關(guān)聯(lián)/添加外鍵)
1) 第一種方式創(chuàng)建表時加外鍵使用實例:
mysql create table A( name char(12), id int(8) ,index(id))engine=innodb; //先建立A表,
mysql create table B( //建立B表,同時做外鍵
- id int(9),
- money int(9),
- index(id),
- foreign key(id) references A (id) //這個是必加項,foreign key(B表要關(guān)聯(lián)的字段),references A表名 (對應(yīng)字段)
- on delete cascade on update cascade //這里是可選項的,只加一項或都不加都可以的,看需求.
- )engine=innodb; //這個必須是innodb類型,并且和A表的一致
第二方式在已有的表上做和A表關(guān)聯(lián)的外鍵(最好是新建好沒有記錄的,不然會因為記錄對不上而創(chuàng)建不成功)
mysql create table C( //這里先創(chuàng)建一個空表C
- id int(7),
- money int(5),
- index(id)
- )engine=innodb;
mysql alter table Cadd constraint abc //在C表上添加和表A關(guān)聯(lián)的外鍵,constraint 外鍵名(自己任意取)
- foreign key(id) references A(id) //和創(chuàng)建時一樣的輸入
- on delete cascade on update cascade; //一樣是可選項,這行不寫也可以通過.
注: @以上的cascade是上面介強的四種模式之一,是可以替換成其它模式的,如寫成on update set null
@還可以同時做兩個外鍵,如寫成foreign key(id,money) references A(id,money) 即可
@兩張表關(guān)聯(lián)字段名可以取不一樣名字,但類型必須一致
定義外鍵的方法和詳細的操作步驟如下:
1、第一步,創(chuàng)建一個主從表,如下圖所示,然后進入下一步。
2、其次,完成上述步驟后,選擇主表,然后單擊設(shè)計表進入表設(shè)計界面,如下圖所示,然后進入下一步。
3、接著,完成上述步驟后,單擊外鍵進入外鍵的設(shè)置界面,如下圖所示,然后進入下一步。
4、然后,完成上述步驟后,設(shè)置外鍵名稱,然后選擇主表的外鍵字段,如下圖所示,然后進入下一步。
5、隨后,完成上述步驟后,設(shè)置與數(shù)據(jù)庫,表名稱和從屬表的單詞相對應(yīng)的外鍵字段,如下圖所示,然后進入下一步。
6、最后,完成上述步驟后,單擊保存即可,如下圖所示。這樣,問題就解決了。
一張表中的主鍵只能有一個,外鍵可以有多個,如果一張表中多個列都需要被別的表的外鍵參考,需要使用候選碼(非空并且唯一),具體到你的這個問題的需求可以考慮用如下方法解決:
把a表中的bookid和authorid都設(shè)置為非空并且唯一,即
create table a(bookid int not null unique, authorid int not null unique);
然后在book表和author表中就可以分別設(shè)置外鍵來參照a表中兩個不同的字段了。
打開我的navicat,然后找到我的teacher表,選中它,然后點擊菜單欄上的‘design table'
2. 在彈出的對話框中找到“Foreign Keys”,然后單機。
3. 然后會出現(xiàn)一個設(shè)置外鍵的界面,一共有七列。簡單介紹一下這幾列的意思?!畁ame’:可以不填,你一會保存成功系統(tǒng)會自動生成。FieldName’:就是你要把哪個鍵設(shè)置為外鍵。這里選擇‘dept’,‘Reference DadaBase’:外鍵關(guān)聯(lián)的數(shù)據(jù)庫?!甊eference Table‘ :關(guān)聯(lián)的表 這里是dept表‘Forgin filed Names’:關(guān)聯(lián)的的字段,這里是code‘ondelete’:就是刪除的時候選擇的動作。這里我的選擇是setNull,意思就是當(dāng)關(guān)聯(lián)的表刪除以后,teacher》dept字段會設(shè)置為null.
4. 設(shè)置完成后點擊‘save’保存退出,也可以點擊‘a(chǎn)dd Foreign Key’再添加一個外鍵。
打開我的navicat,然后找到我的teacher表,選中它,然后點擊菜單欄上的‘design table’。如下圖:
2. 在彈出的對話框中找到“Foreign Keys”,然后單機。如下圖:
3. 然后會出現(xiàn)一個設(shè)置外鍵的界面,一共有七列。簡單介紹一下這幾列的意思。‘name’:可以不填,你一會保存成功系統(tǒng)會自動生成。FieldName’:就是你要把哪個鍵設(shè)置為外鍵。這里選擇‘dept’,‘Reference DadaBase’:外鍵關(guān)聯(lián)的數(shù)據(jù)庫?!甊eference Table‘ :關(guān)聯(lián)的表 這里是dept表‘Forgin filed Names’:關(guān)聯(lián)的的字段,這里是code‘ondelete’:就是刪除的時候選擇的動作。這里我的選擇是setNull,意思就是當(dāng)關(guān)聯(lián)的表刪除以后,teacher》dept字段會設(shè)置為null。如圖
4. 設(shè)置完成后點擊‘save’保存退出,也可以點擊‘a(chǎn)dd Foreign Key’再添加一個外鍵。k如圖:
為已經(jīng)添加好的數(shù)據(jù)表添加外鍵:
語法:alter table 表名 add constraint FK_ID foreign key(你的外鍵字段名) REFERENCES 外表表名(對應(yīng)的表的主鍵字段名);
例: alter table tb_active add constraint FK_ID foreign key(user_id) REFERENCES tb_user(id)
//FK_ID是外鍵的名稱
/*
CREATE TABLE `tb_active` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`content` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`user_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `user_id` (`user_id`),
KEY `user_id_2` (`user_id`),
CONSTRAINT `FK_ID` FOREIGN KEY (`user_id`) REFERENCES `tb_user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
*/
刪除外鍵
語法: ALTER TABLE table-name DROP FOREIGN KEY key-id;
例: ALTER TABLE `tb_active` DROP FOREIGN KEY 'FK_ID'
自動鍵更新和刪除:
外鍵可以保證新插入的記錄的完整性,但是,如果在REFERENCES從句中已命名的表刪除記錄會怎么樣?在使用同樣的值作為外鍵的輔助表中會發(fā)生什么?
很明顯,那些記錄也應(yīng)該被刪除,否則在數(shù)據(jù)庫中就會有很多無意義的孤立記錄,MYSQL可以通過向FOREIGN KEY...REFERENCES修飾符添加一個ON DELETE 或ON UPDATE子句簡化任務(wù),它告訴了數(shù)據(jù)庫在這種情況如何處理孤立任務(wù)。
首先要創(chuàng)建一個字段:alter table 表名 add 字段名 字段類型;
再添加外鍵約束:alter table 需加外鍵的表 add constraint 外鍵名 foreign key(需加外鍵表的字段名) references 關(guān)聯(lián)表名(關(guān)聯(lián)字段名);
注意:外鍵名不能重復(fù)