數(shù)據(jù)庫(kù)表的關(guān)系
- 一對(duì)多關(guān)系
一對(duì)多與多對(duì)一是一個(gè)概念,指的是一個(gè)實(shí)體的某個(gè)數(shù)據(jù)與另外一個(gè)實(shí)體的多個(gè)數(shù)據(jù)有關(guān)聯(lián)關(guān)系。
舉例,學(xué)校中一個(gè)學(xué)、院可以有很多的學(xué)生,而一個(gè)學(xué)生只屬于某一個(gè)學(xué)院(通常情況下),學(xué)院與學(xué)生之間的關(guān)系就是一對(duì)多的關(guān)系,通過外鍵關(guān)聯(lián)來實(shí)現(xiàn)這種關(guān)系。
#創(chuàng)建學(xué)院表:
mysql> CREATE TABLE `department`(
-> `id` INT PRIMARY KEY AUTO_INCREMENT,
-> `name` VARCHAR(10) NOT NULL,
-> `code` INT NOT NULL
-> );
#創(chuàng)建學(xué)生表
mysql> CREATE TABLE `student`(
-> `id` INT PRIMARY KEY AUTO_INCREMENT,
-> `name` VARCHAR(10) NOT NULL,
-> `dep_id` INT,
-> CONSTRAINT `stu_dep_for_key` FOREIGN KEY (`dep_id`) REFERENCES `department`(`id`) ON DELETE RESTRICT
-> );
#插入數(shù)據(jù)
mysql> INSERT INTO `department`(`name`,`code`)
-> VALUES('理學(xué)院',01),
-> ('計(jì)算機(jī)學(xué)院',02)
-> ;
mysql> SELECT * FROM `department`;
mysql> INSERT INTO `student`(`name`,`dep_id`)
-> VALUES('budong',1),
-> ('awen',1),
-> ('dongdong',2);
mysql> SELECT * FROM `student`;
一對(duì)一關(guān)系
舉例,學(xué)生表中有學(xué)號(hào)、姓名、學(xué)院,但學(xué)生還有些比如電話,家庭住址等比較私密的信息,這些信息不會(huì)放在學(xué)生表當(dāng)中,會(huì)新建一個(gè)學(xué)生的詳細(xì)信息表來存放。這時(shí)的學(xué)生表和學(xué)生的詳細(xì)信息表兩者的關(guān)系就是一對(duì)一的關(guān)系,因?yàn)橐粋€(gè)學(xué)生只有一條詳細(xì)信息。用外鍵加主鍵的方式來實(shí)現(xiàn)這種關(guān)系。
mysql> DESCRIBE `student`;
#建立學(xué)生的詳細(xì)信息表
mysql> CREATE TABLE `student_details`(
-> `id` INT PRIMARY KEY AUTO_INCREMENT,
-> `id_card` INT NOT NULL UNIQUE KEY,
-> `telephone` INT,
-> `stu_id` INT,
-> CONSTRAINT `stu_deta_for_key` FOREIGN KEY (`stu_id`) REFERENCES `student`(`id`) ON DELETE CASCADE
-> );
#插入數(shù)據(jù)
mysql> INSERT INTO `student_details`(`id_card`,`telephone`,`stu_id`)
-> VALUES(4301,133,1),
-> (4302,157,2);
#這里信息一一對(duì)應(yīng),所以一般會(huì)同步插入
多對(duì)多關(guān)系
一個(gè)實(shí)體的數(shù)據(jù)對(duì)應(yīng)另外一個(gè)實(shí)體的多個(gè)數(shù)據(jù),另外實(shí)體的數(shù)據(jù)也同樣對(duì)應(yīng)當(dāng)前實(shí)體的多個(gè)數(shù)據(jù)。
舉例,學(xué)生要報(bào)名選修課,一個(gè)學(xué)生可以報(bào)名多門課程,一個(gè)課程有很多的學(xué)生報(bào)名,那么學(xué)生表和課程表兩者就形成了多對(duì)多關(guān)系。對(duì)于多對(duì)多關(guān)系,需要?jiǎng)?chuàng)建第三張關(guān)系表,關(guān)系表中通過外鍵加主鍵的形式實(shí)現(xiàn)這種關(guān)系。
#創(chuàng)建課程表
mysql> CREATE TABLE `course`(
-> `id` INT PRIMARY KEY AUTO_INCREMENT,
-> `name` VARCHAR(20) NOT NULL
-> );
mysql> CREATE TABLE `select`(
-> `stu_id` INT,
-> `coures_id` INT,
-> PRIMARY KEY(`stu_id`,`coures_id`),
-> CONSTRAINT `select_stu_id_for_key` FOREIGN KEY (`stu_id`) REFERENCES `student`(`id`),
-> CONSTRAINT `select_coures_id_for_key` FOREIGN KEY (`coures_id`) REFERENCES `course`(`id`)
-> );