一 主键

1.1 primary key

  1. 主键,但从约束条件上来看,等同于非空且唯一 not null unique
  2. InnoDB存储引擎规定一张表有且只能有一个主键
    如果创建的表中没有主键也没有一个非空且唯一的字段,存储引擎就会采用一个隐藏的字段作为主键,如果创建的表中没有主键但有非空且唯一的字段,那么存储引擎就会自动将该字段设置成主键。
  3. 创建表的时候都应该有一个id字段,并且该字段应该作为主键值。
create table t1(id int primary key,name varchar(32)
);create table t2(pid int,uid int,primary key(pid,uid)
);  # 联合主键

1.2 auto_increment

该约束条件不能单独使用,必须跟在键后面(主要配合主键一起使用)

# 创建表
create table t3(id int primary key auto_increment,name varchar(32) not null unique,password varchar(32)
);# 插入数据
insert into t3(name,password) values('jasper','123'),('lili','321');# 删除数据
delete from t3 where id=2;# 重新插入一条数据
insert into t3(name,password) values('lili','123');
select * from t3;

自增的操作不会因为执行删除操作而回退或者重置,如果想要重置需要使用关键字truncate 表名

truncate t3;  # 删除数据并重置主键值

二 外键(foreign)

2.1 外键简介

创建一张员工表

create table t4(id int primary key auto_increment,name varchar(32) not null unique,gender enum('male','female') default 'male',dep_name varchar(32),dep_describe varchar(32)
);# 插入数据
insert into t4(name,gender,dep_name,dep_describe) values('jasper','male','讲师部','教书育人'),
('lili','female','财务部','发工资');

上表的缺陷:

  1. 表结构不清晰,又是员工表又是部门表
  2. 字段数据反复存取,浪费存储空间
  3. 表的扩展性极差

优化操作:将表拆开,添加外键。

表数据关系判定:换位思考
针对员工表和部门表
先站在员工表的角度:

  1. 问:一条员工表中的数据能否对应多条部门表数据
  2. 答:否

在站在部门表中的角度

  1. 问:一条部门表的数据能否对应多条员工表的数据
  2. 答 :是

得出结论:员工表和部门表属于一对多关系

如何创建一对多的关系表?

  1. 先写普通字段
  2. 最后再写外键字段

2.2 表关系之一对多

创建一对多关系表


create table staff(id int primary key auto_increment,name varchar(32) not null unique,gender enum('male','female') default 'male',department_id int,foreign key(department_id) references department(id)
);create table department(id int primary key auto_increment,dep_name varchar(32),dep_describe varchar(32)
);

级联更新、级联删除(被关联的数据一旦变动,关联的数据跟着变动)

create table staff(id int primary key auto_increment,name varchar(32) not null unique,gender enum('male','female') default 'male',department_id int,foreign key(department_id) references department(id)on update cascade on delete cascade
);create table department(id int primary key auto_increment,dep_name varchar(32),dep_describe varchar(32)
);

插入数据(先插入被关联的表)

insert into department(dep_name,dep_describe) values('讲师部','教书育人'),
('财务部','发工资'),('安保部','保卫安全');insert into staff(name,department_id) values('jasper',1),('lili',2),('jack',3),('jarry',1);

2.3 表关系之多对多

作者表和书籍表
先站在作者表的角度:

  1. 问:一条作者表中的数据能否对应多条书籍表数据
  2. 答:是

在站在书籍表中的角度

  1. 问:一条书籍表的数据能否对应多条作者表的数据
  2. 答 :是

得出结论:作者表与书籍表是多对多关系

创建表

create table author(id int primary key auto_increment,name varchar(32)
);create table book(id int primary key auto_increment,name varchar(32),price float(10,2)
);create table book_author(id int primary key auto_increment,book_id int,foreign key(book_id) references book(id)on update cascade on delete cascade,author_id int,foreign key(author_id) references author(id)on update cascade on delete cascade
);

插入数据

insert into book(name, price) values('水浒传',49.9),('西游记',59.9),('三国演义',39.9),('红楼梦',29.9),('葵花宝典',0);insert into author(name) values('吴承恩'),('曹雪芹'),('罗贯中'),('施耐庵'),('张三'),('李四');insert into book_author(book_id,author_id) values(1,4),(2,1),(3,3),(4,2),(5,5),(5,6);

2.4 表关系之一对一

用户表和用户详情表
先站在用户表的角度:

  1. 问:一条用户表中的数据能否对应用户详情表数据
  2. 答:否

在站在用户详情表的角度

  1. 问:一条用户详情表的数据能否对应多条用户表的数据
  2. 答 :否

用户表和用户详情表之间存在关系
得出结论:用户表和用户详情表是一对一关系

创建表

create table user(id int primary key auto_increment,name varchar(32),password varchar(32),info_id int unique,foreign key(info_id) references info(id) on update cascade on delete cascade
);create table info(id int primary key auto_increment,address varchar(32),phone_num varchar(32)
);

插入数据

insert into info(address,phone_num) values('上海','110'),('北京','120'),('深圳','130');insert into user(name,password,info_id) values('jasper','123',1),('lili','321',2),('jack','666',3);

练习

判断下列表数据关系 并自定义创建出表
有些表数据关系不是确定 根据具体业务可能有变化

  1. 服务器表与应用程序表
  2. 课程表与班级表
  3. 学生表与班级表
  4. 老师表与课程表
  5. 书籍表与出版社表
# 1 一对多关系
create table server(id int primary key auto_increment,ip varchar(32),port int
);create table client(id int primary key auto_increment,ip varchar(32),port int,unique(ip,port),server_id int,foreign key(server_id) references server(id) on update cascade on delete cascade
);# 2 多对多关系
create table class(id int primary key auto_increment,name varchar(32)
);create table course(id int primary key auto_increment,name varchar(32)
);create table class_course(id int primary key auto_increment,class_id int,foreign key(class_id) references class(id) on update cascade on delete cascade,course_id int,foreign key(course_id) references course(id) on update cascade on delete cascade
);# 3 一对多关系
create table student(id int primary key auto_increment,name varchar(32),age int,gender enum('male','female'),class_id int,foreign key(class_id) references class1(id)
);create table class1(id int primary key auto_increment,name varchar(32)
);# 4 多对多关系
create table teacher(id int primary key auto_increment,name varchar(32),gender enum('male','female') default 'male'
);create table course1(id int primary key auto_increment,name varchar(32)
);create table teacher_course(id int primary key auto_increment,teacher_id int,foreign key(teacher_id) references teacher(id) on update cascade on delete cascade,course_id int,foreign key(course_id) references course1(id) on update cascade on delete cascade
);# 5 一对多关系
create table publishing(id int primary key auto_increment,name varchar(32),book_id int,foreign key(book_id) references book1(id) on update cascade on delete cascade
);create table book1(id int primary key auto_increment,name varchar(32),price float(10,2)
);

三十一、数据库相关2相关推荐

  1. 三十三、数据库相关4

    数据库相关 一 多表查询练习 二 python操作MySQL 2.1 基本操作 2.2 获取结果相关方法 三 SQL注入问题 四 小知识补充 练习 数据导入到Navicat(创建文件,以.sql结束, ...

  2. 三十二、数据库相关3

    数据库相关 一 操作表的sql语句补充 二 表查询关键字 2.1 select from 2.2 where 筛选 2.3 group by 分组 2.4 having 过滤 2.5 distinct ...

  3. 使用IntelliJ IDEA开发SpringMVC网站(三)数据库配置

    原文:使用IntelliJ IDEA开发SpringMVC网站(三)数据库配置 摘要 讲解在IntelliJ IDEA中,如何进行Mysql数据库的配置 目录[-] 文章已针对IDEA 15做了一定的 ...

  4. 【FastDev4Android框架开发】RecyclerView完全解析之下拉刷新与上拉加载SwipeRefreshLayout(三十一)...

    转载请标明出处: http://blog.csdn.net/developer_jiangqq/article/details/49992269 本文出自:[江清清的博客] (一).前言: [好消息] ...

  5. Python编程基础:第三十一节 文件读取Read a File

    第三十一节 文件读取Read a File 前言 实践 前言 当我们检测到文件之后就可以读取其中的内容,读取所用到的函数是read(). 实践 我们依然以上一节的lyric.txt为例展示如何读取文件 ...

  6. OpenCV学习笔记(三十一)——让demo在他人电脑跑起来 OpenCV学习笔记(三十二)——制作静态库的demo,没有dll也能hold住 OpenCV学习笔记(三十三)——用haar特征训练自己

    OpenCV学习笔记(三十一)--让demo在他人电脑跑起来 这一节的内容感觉比较土鳖.这从来就是一个老生常谈的问题.学MFC的时候就知道这个事情了,那时候记得老师强调多次,如果写的demo想在人家那 ...

  7. 数据库相关中间件介绍

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt412 这里主要介绍互联网行业内有关数据库的相关中间件.数据库相关平台主要解决 ...

  8. php调用mysql库_PHP调用三种数据库的方法(1)

    PHP调用三种数据库的方法(1) 更新时间:2006年10月09日 00:00:00   作者: MySQL是一个小巧灵珑的数据库服务器软件,对于中.小型应用系统是非常理想的.除了支持标准的ANSI ...

  9. 数据库相关的论文笔记

    db-readings 数据库相关的论文笔记 分布式理论-自问自答 GFS阅读问题 为什么存储三个副本?而不是两个或者四个? Chunk的大小为何选择64MB?这个选择主要基于哪些考虑? GFS主要支 ...

  10. 数据库相关中间件收录集

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

最新文章

  1. 小型的ESP8266-01s WiFi串口模块是否可以下载MicroPython?
  2. 程序包com.sun.image.codec.jpeg.JPEGCo不存在解决办法
  3. MPLS基本结构是怎样的?—Vecloud微云
  4. 社区电商才是未来,新科技才是社区电商的核心,社区电商如何实现核心竞争力呢?
  5. Python获取.wav音频的时长
  6. 【Manacher】最长双回文串(luogu 4555)
  7. ubuntu命令行启动浏览器_Ubuntu 秘笈之命令行下管理浏览器书签
  8. 圆你国产数据库DBA之梦,达梦DCA培训考试券免费拿
  9. linux中split函数用法,Linux split命令参数及使用方法详解
  10. P2P端口映射 UPnP功能和使用详解
  11. RESTful 风格 API 接口文档模板
  12. ajax调用一般应用程序,【Web前端】---js调用本地应用程序
  13. 基于FFMPEG的H264视频解码库(流式解码)
  14. 颠覆式创新看世界,读《第二曲线创新》有感
  15. 透镜成像、眼球成像、小孔成像原理
  16. VMware连接不上网络解决办法
  17. wordpress 漂亮的Cosy主题
  18. Canvas—2D 绘图
  19. token 微信access 过期_微信开发ACCESS TOKEN 过期失效解决方案
  20. MyBatis--对象的联合查询

热门文章

  1. 打印空心的倒三角模型
  2. 推荐系统的向量检索工具: Annoy Faiss
  3. 【Java】 @Override is not allowed when implementing interface method
  4. 人大金仓KingbaseES表的唯一约束的作用
  5. 技能 |【巨人之肩】读书心得:思考·后半本 (作者: 时寒冰)
  6. arduino控制触控传感器
  7. android提供的安全功能电力仪表,多功能电力仪表的接线须知,安全的前提是你有充足的技术知识!...
  8. 大学校园双向选择洽谈会总结
  9. 记录一次使用 Popper.js 编写弹框遇到的问题
  10. Linux mem 1.1 用户态进程空间的创建 --- execve() 详解