多表关联:

多张数据表之间是可以有一定的关联关系,这种关联关系可以通过外键约束实现

多表的分类:

一对一、一对多、多对多

一对一:

一张表对应另一张表

适用场景:

人和身份证。一个人只能有一个身份证,一个身份证只能对应一个人!

建表原则:

任意一个表建立外键,去关联另外一个表的主键,并设置外键为唯一约束

演示:

-- 创建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);