【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. 多对多:
    比如一个学生选多个课程,一个课程被多个学生选一样。
相关推荐
Matrix7014 分钟前
HBase理论_HBase架构组件介绍
大数据·数据库·hbase
不太灵光的程序员16 分钟前
【HBase分布式数据库】第七章 数据的导入导出 importtsv导入数据
数据库·分布式·hbase
Mephisto.java21 分钟前
【大数据学习 | HBASE高级】region split机制和策略
数据库·学习·hbase
大气层煮月亮30 分钟前
python调用MySql详细步骤
数据库·mysql
Yawesh_best33 分钟前
MySQL(5)【数据类型 —— 字符串类型】
android·mysql·adb
Code哈哈笑39 分钟前
【MySQL 保姆级教学】详细讲解视图--(15)
数据库·mysql
x2lab1 小时前
国产化 ARM 环境mysql-mariadb 部署
arm开发·mysql·docker·mariadb
哭哭啼2 小时前
Redis环境部署(主从模式、哨兵模式、集群模式)
数据库·redis·缓存
咕噜Yuki06092 小时前
OCP证书如何下载?
数据库·ocp·证书查询
冬瓜3122 小时前
linux-c 使用c语言操作sqlite3数据库-1
数据库·sqlite