目录
数据库约束
- 是关系型数据库的一个重要功能,
- 主要作用是保证数据的完整性,也可能理解数据的正确性(数据本身是否正确,关联关系是否正确),
- 人工检查数据完整性的工作量非常的大,在数据表中定义一些约束,那么数据库写入数据的时候,数据库会帮我们做校验工作,
- 约束一般是指定在列上的,
- 使用在表的定义时在要约束的列的类型后加上。
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面向对象编程
设计表:
- 从需求中获得类,类对应到数据库中的实体,实体在数据库中就表现为一张一张的表,类中的属性就对应着表中的字段(列),
- 确定类与类之间的关系,
- 使用SQL去创建具体的表。
三大范式
设计表的时候我们一般要遵循一些规则,这些规则我们一般称之为三大范式。
范式就是描述数据关系的模型,下面只介绍三大范式。
第一范式
第一范式就是表中的字段不可再拆分。
第一范式是关系型数据库最基本的要求,不满足第一范式的数据库不是关系型数据库。
也就是在定义表时每个字段都可以用一种数据类型来表示,那么这个表就是满足第一范式的。
第二范式
在满足第一范式的基础上,不存在非关键字段对任意候选字段存在部分函数依赖(存在于复合主键的情况下)
非关键字段即非主键字段,候选字段可以理解为主键或者没有主键时的唯一键。
对于由两个或多个关键字段(复合主键)决定一条记录的情况,如果一行数据中有些字段只与关键字段中的一个有关系,那么这种就说他只存在部分函数依赖。
表中没有复合主键的表天然满足第二范式。
第三范式
在第二范式的基础上,不存在非关键字段,对任一候选键的传递依赖。
两个强相关关系存在传递现象,这种传递关系称为传递依赖。比如学生表中拿到学号,可以根据学号拿到学校,根据学校又可以拿到学院等信息。
表的关系
- 一对一:
比如一个人只有一个身份证一样。 - 一对多:
比如一个班级拥有多个学生一样。 - 多对多:
比如一个学生选多个课程,一个课程被多个学生选一样。