mysql中的外鍵


原文鏈接:這里
0.基本概念

有外鍵就有主鍵,外鍵是相對於主鍵的。

主鍵:表中的一個或多個字段,它的值用於唯一的標識表中的某一條記錄
外鍵:是兩個表數據之間建立連接的方式。可以是一列也可以是多列。一個表中可以設置一個或多個外鍵。
外鍵名:定義外鍵約束的名稱,一個表中不能有相同名稱的外鍵。
字段名:表示從表需要添加外鍵約束的字段列。
主表名:即被從表外鍵所依賴的表的名稱
主鍵列:表示主表中定義的主鍵字段,或者字段組合。
主表(父表):對於兩個有關聯的表而言,相關字段中主鍵所在的那個表為主表。從表(子表):對於兩個有關聯的表而言,相關字段中的外鍵所在的那個表為從表。

外鍵的一些特定及規定:

(1)一個表的外鍵可以是空值,若不為空值,則每一個外鍵值必須等於另外一個表中的主鍵的某個值。
(2)外鍵是一個表中的字段,他可以不是本表中的主鍵,但對應另外一個表的主鍵,外鍵的作用是保證數據引用的完整性。
(3) 從表外鍵類型,必須與主表主鍵類型一致。

1.場景舉例

數據庫中有個學生表,如下:

-- 創建學生表
DROP TABLE IF EXISTS `students`;
CREATE TABLE `students` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`stu_name` varchar(20) NOT NULL COMMENT '學生姓名',
`stu_sex` varchar(10) NOT NULL COMMENT '學生性別',
`class_id` int(10) NOT NULL COMMENT '年級',
`age` int(10) NOT NULL DEFAULT 18 COMMENT '年齡',
`create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP,
`update_time` datetime NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1000 DEFAULT CHARSET=utf8;

然后,學生表里有個字段”class_id“, 這個字段表示年級,這個字段作為外鍵,關聯到”grade“表

DROP TABLE IF EXISTS `grade`;
CREATE TABLE `grade` (
`grade_id` int(10) NOT NULL AUTO_INCREMENT COMMENT '年級id',
grade_name varchar(20) NOT NULL COMMENT '年級的名字',
teacher_name varchar(10) NOT NULL COMMENT '班主任',
teacher_phone int(11) NOT NULL COMMENT '班主任電話',
`create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP,
`update_time` datetime NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`grade_id`)
)ENGINE=InnoDB AUTO_INCREMENT=1000 DEFAULT CHARSET=utf8;

現在要把這個表關聯起來,students表中的class_id 就作為一個外鍵關聯到grade表中。

關聯方式有兩種:

//方式1
[constraint 外鍵約束關系的名稱] foreign key 從表(外鍵字段名稱) references 主表(主鍵字段名稱)
 
//方式2
alter table 從表 add [constraint] [外鍵名稱] foreign key (從表外鍵字段名) references 主表 (主表的主鍵);

我們用第二種方式進行關聯:

-- 創建外鍵(適用於一開始創建表的時候沒有外鍵的情況)
ALTER TABLE students
ADD CONSTRAINT class_id FOREIGN KEY(`class_id`) REFERENCES `grade` (`grade_id`)

重新刷新數據庫就能看到外鍵設置正確了。

相當於下面這種情況:

簡單解釋一下就是:students表的class_id列引用了grade表的grade_id,

2.實際應用

未完待續。。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM