多表关联:
多张数据表之间是可以有一定的关联关系,这种关联关系可以通过外键约束实现
多表的分类:
一对一、一对多、多对多
一对一:
一张表对应另一张表
适用场景:
人和身份证。一个人只能有一个身份证,一个身份证只能对应一个人!
建表原则:
在
任意
一个表建立外键,去关联另外一个表的主键,并设置外键为唯一约束
演示:
-- 创建Person表
CREATE TABLE person(
id INT PRIMARY KEY AUTO_INCREMENT, -- 主键id
name VARCHAR(20) -- 姓名
);
-- 添加数据
INSERT INTO person VALUES (NULL,'韩信'), (NULL,'李白');
-- 创建card表
CREATE TABLE card(
id INT PRIMARY KEY AUTO_INCREMENT, -- 主键id
number VARCHAR(18), -- 身份证号码
pid INT UNIQUE, -- 外键列
CONSTRAINT cp FOREIGN KEY (pid) REFERENCES person(id) -- 外键关联主键
);
-- 添加数据
INSERT INTO card VALUES (NULL,'12345',1),(NULL,'56789',2);
一对多:
一张表对应多张表
适用场景举例:
- 商品分类和商品。一个分类下可以有多个商品。
建表原则:
在
多
的一方,建立外键约束,来关联一的一方主键
演示:
-- 创建分类表
CREATE TABLE category(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(10)
);
-- 添加数据
INSERT INTO category VALUES (NULL,'手机数码'),(NULL,'电脑办公');
-- 创建商品表
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);