【MYSQL】表的设计

目录

数据库约束

  • 是关系型数据库的一个重要功能,
  • 主要作用是保证数据的完整性,也可能理解数据的正确性(数据本身是否正确,关联关系是否正确),
  • 人工检查数据完整性的工作量非常的大,在数据表中定义一些约束,那么数据库写入数据的时候,数据库会帮我们做校验工作,
  • 约束一般是指定在列上的,
  • 使用在表的定义时在要约束的列的类型后加上。

not null 约束

表示该列不能存储null值。

如果存入null会报错。

unique (唯一)约束

表示该列中的数据不能重复(null)除外。

插入相同或者已有的值会报错。

default 默认值约束

指定列为空时的默认值。

primary key (主键)约束

相当于是not null 和 unique的结合,

表示该列中的数据既不能重复也不能为空。

如果存入null会报错。插入相同或者已有的值也会报错。

当主键是整型时,我们常常加上auto_increment让主键从当前最大值加1,

但是当插入错误时该值相当于被生成了,下一个从这个开始。

通俗将就是当前主键最大值为7,然后插入时报错了,改回来后插入行主键为9。

一张表中最多只能定义一个主键,定义超了就会报错,

要想多列为主键只能使用复合主键primary key (列名1, 列名2)

使用复合主键,必须列值都相同才算重复,任一列值都不能为null。

foreign key (外键)约束

保证一个表中的数据匹配另一个表中的值的参照完整性。

就是将另一个表中的值作为该表中该列的范围。

被外键约束的列在约束前先定义,

语法是foreign key (列名) references 外表名(外列名)

被外键约束的表还存在就不能删除外表。

check 约束

该约束在5.7版本不能使用,导致兼容性不好,所以一般不用。

使用了该约束后该列只能插入被约束的值。

总结

约束类型 说明 示例
not null 约束 使用not null指定列不能为空 name varchar(20) not null,
unique 约束 指定列为唯一的、不重复的,null除外 name varchar(20) unique,
default 默认值约束 指定列为空时的默认值 age int default 20,
primary key 主键约束 not null 和 unique 的结合 id int primary key,
foreign key外键约束 关联其他表的主键或唯一键 foreign key (字段名) references 主表(列)
check约束 保证列中的值符合指定的条件 check (gender = '男' or gender ='女')

表的设计

一般我们编程流程如下:

OOA面向对象分析 -》OOD面向对象设计 -》OOP面向对象编程

设计表:

  1. 从需求中获得类,类对应到数据库中的实体,实体在数据库中就表现为一张一张的表,类中的属性就对应着表中的字段(列),
  2. 确定类与类之间的关系,
  3. 使用SQL去创建具体的表。

三大范式

设计表的时候我们一般要遵循一些规则,这些规则我们一般称之为三大范式。

范式就是描述数据关系的模型,下面只介绍三大范式。

第一范式

第一范式就是表中的字段不可再拆分。

第一范式是关系型数据库最基本的要求,不满足第一范式的数据库不是关系型数据库。

也就是在定义表时每个字段都可以用一种数据类型来表示,那么这个表就是满足第一范式的。

第二范式

在满足第一范式的基础上,不存在非关键字段对任意候选字段存在部分函数依赖(存在于复合主键的情况下)

非关键字段即非主键字段,候选字段可以理解为主键或者没有主键时的唯一键。

对于由两个或多个关键字段(复合主键)决定一条记录的情况,如果一行数据中有些字段只与关键字段中的一个有关系,那么这种就说他只存在部分函数依赖。

表中没有复合主键的表天然满足第二范式。

第三范式

在第二范式的基础上,不存在非关键字段,对任一候选键的传递依赖。

两个强相关关系存在传递现象,这种传递关系称为传递依赖。比如学生表中拿到学号,可以根据学号拿到学校,根据学校又可以拿到学院等信息。

表的关系

  1. 一对一:
    比如一个人只有一个身份证一样。
  2. 一对多:
    比如一个班级拥有多个学生一样。
  3. 多对多:
    比如一个学生选多个课程,一个课程被多个学生选一样。
相关推荐
Ahern_11 分钟前
Oracle 普通表至分区表的分区交换
大数据·数据库·sql·oracle
夜半被帅醒30 分钟前
MySQL 数据库优化详解【Java数据库调优】
java·数据库·mysql
不爱学习的啊Biao44 分钟前
【13】MySQL如何选择合适的索引?
android·数据库·mysql
破 风1 小时前
SpringBoot 集成 MongoDB
数据库·mongodb
Rverdoser1 小时前
MySQL-MVCC(多版本并发控制)
数据库·mysql
醒了就刷牙1 小时前
黑马Java面试教程_P9_MySQL
java·mysql·面试
m0_748233641 小时前
SQL数组常用函数记录(Map篇)
java·数据库·sql
dowhileprogramming1 小时前
Python 中的迭代器
linux·数据库·python
0zxm2 小时前
08 Django - Django媒体文件&静态文件&文件上传
数据库·后端·python·django·sqlite
橘子师兄4 小时前
如何在自己的云服务器上部署mysql
运维·服务器·mysql