多表关联:
多张数据表之间是可以有一定的关联关系,这种关联关系可以通过外键约束实现
多表的分类:
- 一对一
- 一对多
- 多对多
一对一:
一张表对应一张表
适用场景举例:
人和身份证。一个人只能有一个身份证,一个身份证只能对应一个人!
建表原则:
在
任意
一个表建立外键,去关联另外一个表的主键
演示:
-- 创建Person表
CREATE TABLE person(id INT PRIMARY KEY AUTO_INCREMENT, -- 主键idname VARCHAR(20) -- 姓名
);-- 添加数据
INSERT INTO person VALUES (NULL,'韩信'), (NULL,'李白');-- 创建card表
CREATE TABLE card(id INT PRIMARY KEY AUTO_INCREMENT, -- 主键idnumber VARCHAR(50), -- 身份证号码pid INT UNIQUE, -- 外键列CONSTRAINT cp FOREIGN KEY (pid) REFERENCES person(id) -- 外键关联主键
);-- 添加数据
INSERT INTO card VALUES (NULL,'12345',1),(NULL,'56789',2);
一对多:
一张表对应多张表
适用场景举例:
- 商品分类和商品。一个分类下可以有多个商品。
建表原则:
在
多
的一方,建立外键约束,来关联一的一方主键
演示:
-- 创建category表
CREATE TABLE category(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(10)
);
-- 添加数据
INSERT INTO category VALUES (NULL,'手机数码'),(NULL,'电脑办公');-- 创建product表
CREATE TABLE product(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(30),cid INT,CONSTRAINT pc_fk1 FOREIGN KEY (cid) REFERENCES category(id) -- 添加外键约束
);
-- 添加数据
INSERT INTO product VALUES (NULL,'华为P30',1),(NULL,'小米note3',1),
(NULL,'联想电脑',2),(NULL,'苹果电脑',2);
多对多:
多张表对应多张表
适用场景举例:
学生和课程。一个学生可以选择多个课程,一个课程也可以被多个学生选择!
建表原则:
需要借助第三张表中间表,中间表至少包含两个列,这两个列作为中间表的外键,分别关联两张表的主键
演示:
-- 创建student表
CREATE TABLE student(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(20)
);
-- 添加数据
INSERT INTO student VALUES (NULL,'韩信'),(NULL,'干将');-- 创建course表
CREATE TABLE course(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(10)
);-- 添加数据
INSERT INTO course VALUES (NULL,'打野'),(NULL,'中路');-- 创建中间表
CREATE TABLE stu_course(id INT PRIMARY KEY AUTO_INCREMENT,sid INT, -- 用于和student表的id进行外键关联cid INT, -- 用于和course表的id进行外键关联CONSTRAINT sc_fk1 FOREIGN KEY (sid) REFERENCES student(id), -- 添加外键约束CONSTRAINT sc_fk2 FOREIGN KEY (cid) REFERENCES course(id) -- 添加外键约束
);-- 添加数据
INSERT INTO stu_course VALUES (NULL,1,1),(NULL,1,2),(NULL,2,1),(NULL,2,2);