MySQL
- MYSQL 多表设计 一对多
- 插入测试数据
- 外键约束(物理外键)
- 使用逻辑外键
- MYSQL 多表设计 一对一
- 表结构
- MYSQL 多表设计 多对多
MYSQL 多表设计 一对多
建表语句
员工表
CREATE TABLE tb_emp (id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT 'ID',username VARCHAR(20) NOT NULL UNIQUE COMMENT '用户名',password VARCHAR(32) DEFAULT '123456' COMMENT '密码',name VARCHAR(10) NOT NULL COMMENT '姓名',gender TINYINT UNSIGNED NOT NULL COMMENT '性别,说明: 1 男,2 女',image VARCHAR(300) COMMENT '图像',job TINYINT UNSIGNED COMMENT '职位,说明: 1 班主任, 2 讲师, 3 学工主管, 4 教研主管',entrydate DATE COMMENT '入职时间',dept_id INT UNSIGNED COMMENT '归属的部门ID',create_time DATETIME NOT NULL COMMENT '创建时间',update_time DATETIME NOT NULL COMMENT '修改时间'
) COMMENT '员工表';
部门表
CREATE TABLE tb_dept (id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT 'ID',name VARCHAR(10) NOT NULL UNIQUE COMMENT '部门名称',create_time DATETIME NOT NULL COMMENT '创建时间',update_time DATETIME NOT NULL COMMENT '修改时间'
) COMMENT '部门表';
插入测试数据
insert into tb_dept (id, name, create_time, update_time) values
(1,'学工部',now(),now()),(2,'教研部',now(),now()),(3,'咨询部',now(),now()),
(4,'就业部',now(),now()),(5,'人事部',now(),now());INSERT INTO tb_emp
(id, username, password, name, gender, image, job, entrydate,dept_id, create_time, update_time) VALUES
(1,'jinyong','123456','金庸',1,'1.jpg',4,'2000-01-01',2,now(),now()),
(2,'zhangwuji','123456','张无忌',1,'2.jpg',2,'2015-01-01',2,now(),now()),
(3,'yangxiao','123456','杨逍',1,'3.jpg',2,'2008-05-01',2,now(),now()),
(4,'weiyixiao','123456','韦一笑',1,'4.jpg',2,'2007-01-01',2,now(),now()),
(5,'changyuchun','123456','常遇春',1,'5.jpg',2,'2012-12-05',2,now(),now()),
(6,'xiaozhao','123456','小昭',2,'6.jpg',3,'2013-09-05',1,now(),now()),
(7,'jixiaofu','123456','纪晓芙',2,'7.jpg',1,'2005-08-01',1,now(),now()),
(8,'zhouzhiruo','123456','周芷若',2,'8.jpg',1,'2014-11-09',1,now(),now()),
(9,'dingminjun','123456','丁敏君',2,'9.jpg',1,'2011-03-11',1,now(),now()),
(10,'zhaomin','123456','赵敏',2,'10.jpg',1,'2013-09-05',1,now(),now()),
(11,'luzhangke','123456','鹿杖客',1,'11.jpg',1,'2007-02-01',1,now(),now()),
(12,'hebiweng','123456','鹤笔翁',1,'12.jpg',1,'2008-08-18',1,now(),now()),
(13,'fangdongbai','123456','方东白',1,'13.jpg',2,'2012-11-01',2,now(),now()),
(14,'zhangsanfeng','123456','张三丰',1,'14.jpg',2,'2002-08-01',2,now(),now()),
(15,'yulianzhou','123456','俞莲舟',1,'15.jpg',2,'2011-05-01',2,now(),now()),
(16,'songyuanqiao','123456','宋远桥',1,'16.jpg',2,'2010-01-01',2,now(),now()),(17,'chenyouliang','123456','陈友谅',1,'17.jpg',NULL,'2015-03-21',NULL,now(),now());
外键约束(物理外键)
以上添加一个外键,将员工表的
dept_id
绑定至 部门表的id
字段上
若无员工使用某个主表外键id
则可以删除某个部门
不建议
\禁止
使用物理外键
概念: 使用 foreign key 定义外键关联另外一张表缺点:
影响增、删、改的效率(需要检查外键关系)
仅用于单节点数据库,不适用与分布式、集群场景
容易引发数据库的死锁问题,消耗性能
使用逻辑外键
概念: 在业务层逻辑中,解决外键关联
通过逻辑外键,就可以很方便的解决上述问题
MYSQL 多表设计 一对一
案例: 用户 与 身份证信息 的关系
关系: 一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其他字段放在另一张表中,以提升操作效率实现: 在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的(UNIQUE)
表结构
CREATE TABLE tb_user (id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT 'ID',name VARCHAR(10) NOT NULL COMMENT '姓名',gender TINYINT UNSIGNED NOT NULL COMMENT '性别, 1 男 2 女',phone CHAR(11) COMMENT '手机号',degree VARCHAR(10) COMMENT '学历'
) COMMENT '用户信息表';INSERT INTO tb_user VALUES (1, '白眉鹰王', 1, '18812340001', '初中'),(2, '青翼蝠王', 1, '18812340002', '大专'),(3, '金毛狮王', 1, '18812340003', '初中'),(4, '紫衫龙王', 2, '18812340004', '硕士');CREATE TABLE tb_user_card (id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT 'ID',nationality VARCHAR(10) NOT NULL COMMENT '民族',birthday DATE NOT NULL COMMENT '生日',idcard CHAR(18) NOT NULL COMMENT '身份证号',issued VARCHAR(20) NOT NULL COMMENT '签发机关',expire_begin DATE NOT NULL COMMENT '有效期限-开始',expire_end DATE COMMENT '有效期限-结束',user_id INT UNSIGNED NOT NULL UNIQUE COMMENT '用户ID',CONSTRAINT fk_user_id FOREIGN KEY (user_id) REFERENCES tb_user(id)
) COMMENT '用户信息表';INSERT INTO tb_user_card VALUES (1, '汉', '1960-11-06', '100000100000100001', '朝阳区公安局', '2000-06-10', NULL, 1),(2, '汉', '1971-11-06', '100000100000100002', '静安区公安局', '2005-06-10', '2025-06-10', 2),(3, '汉', '1963-11-06', '100000100000100003', '昌平区公安局', '2006-06-10', NULL, 3),(4, '回', '1980-11-06', '100000100000100004', '海淀区公安局', '2008-06-10', '2028-06-10', 4);
MYSQL 多表设计 多对多
案例: 学生与 课程的关系
关系: 一个学生可以选修多门课程,一门课程也可以供多个学生选择实现: 建立第三张中间表,中间表至少包含两个外键,分别关联两方主键
CREATE TABLE tb_student(id INT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID',name VARCHAR(10) COMMENT '姓名',no VARCHAR(10) COMMENT '学号'
) COMMENT '学生表';
INSERT INTO tb_student(name, no) VALUES ('黛绮丝', '2000100101'),('谢逊', '2000100102'),('殷天正', '2000100103'),('韦一笑', '2000100104');CREATE TABLE tb_course(id INT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID',name VARCHAR(10) COMMENT '课程名称'
) COMMENT '课程表';
INSERT INTO tb_course (name) VALUES ('Java'), ('PHP'), ('MySQL') , ('Hadoop');CREATE TABLE tb_student_course(id INT AUTO_INCREMENT COMMENT '主键' PRIMARY KEY,student_id INT NOT NULL COMMENT '学生ID',course_id INT NOT NULL COMMENT '课程ID',CONSTRAINT fk_courseid FOREIGN KEY (course_id) REFERENCES tb_course (id),CONSTRAINT fk_studentid FOREIGN KEY (student_id) REFERENCES tb_student (id)
)COMMENT '学生课程中间表';
INSERT INTO tb_student_course(student_id, course_id) VALUES (1,1),(1,2),(1,3),(2,2),(2,3),(3,4);