数据库约束&表设计

前言:数据库约束是关系型数据库的一个重要功能,主要作用就是保证数据库数据的完整性,也可以理解为数据的正确性(数据本身是否正确,关联关系是否正确)

约束一般是指定在列上。

1.约束类型

1.1 NOT NULL ----指某一个列不能存储NULL值

定义id规定不能为空,所以查看表结构时NULL为NO

插入NULL数据则报错!

1.2 UNIQUE ----保证某列的每行必须有唯一的值

1.3 DEFAULT ----规定没有给列赋值时的默认值

注意:①当某列设置值了默认的约束的时候,如果不给这个列指定值才会用默认值!

②用户指定的优先级高于默认值约束!

1.4 PRIMARY KEY (主键)----not null和unique的结合(非空且唯一),确保列有唯一表示,有助于更容易快速地找到表中的一个特定的值

由此可见not null和unique结合就是primary key,可以直接定义为primary key

一般与主键搭配使用还有自增(auto increment)

注意:主键约束帮我们校验了非空且唯一,这两个校验在写入数据时对效率有一点影响,强烈建议每一张表都定义一个主键!

自增:让数据库帮我们去维护主键的增长,不用我们去借宿那,在插入时会先找到最大值,在最大值上+1,要是期间写了一条错误语句,这时候主键已经自增,不会退回,可能会出现不连续主键,但不影响!自增情况下,写入null值,数据库会自动处理null(自增成有效数据!)

注意:一个表中不允许有两个主键,但是一个主键可以有两个列(复合主键!)

在唯一校验时,只有复合主键中所有的列的值都相同,才会判定为相同数据!

1.5 FOREIGN KEY(外键) ----保证一个表中的数据匹配另一个表中的值的参照完整性

语法:foreign key (列名) references 主表(列);

表中某一列的值,必须是另外一张表中的主键列,也就是这个值必须在另外一张表存在,且满足主键或唯一约束!

示例:创捷学生表和班级表

写入正确数据是可以成功插入的,要是插入一个不存在的班级的学生会报错!

删除主表中的数据时,子表中不能有对该条记录的依赖,就意味着先要删除自己表中的记录,才可以删除主表的记录!

1.6 CHECK ----保证列中的值符合指定条件

MYSQL8.0 是有效的,MYSQL5.7 无效,所以这个语句不经常使用!

2.表的设计

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

设计表会遵循三大范式!(了解概念)

2.1第一范式 (1NF)

关系型数据库的一个最基本的要求,表里的字段不可在拆分!

2.2第二范式 (2NF)

满足1NF的基础上,不存在非关键字段(非主键字段)对任意候选键(主键,外键,没有主键的唯一键)的不分函数依赖(存在于符合主键的情况下)

2.3第三范式 (3NF)

满足2NF的基础上,不存在非关键字段对任一候选键的函数依赖

第三范式可以解决数据冗余,更新异常,插入异常,删除异常的问题!!!

数据库知识不定期更新,谢谢大家的关注与点赞!

相关推荐
阿里-于怀24 分钟前
消息队列详解:从基础到高级应用
java·数据库·中间件
耳东哇1 小时前
mybatisplus mysql嵌套查询传入多个参数
数据库·mysql
小小小汐-1 小时前
【mysql】数据库基础
数据库·mysql
三天不学习1 小时前
【实体配置】.NET开源 ORM 框架 SqlSugar 系列
数据库·c#·.net·orm
三天不学习1 小时前
【Db First】.NET开源 ORM 框架 SqlSugar 系列
数据库·.net·orm
cooldream20091 小时前
MySQL 启动失败问题分析与解决方案:`mysqld.service failed to run ‘start-pre‘ task`
数据库·mysql
但老师1 小时前
如何在MySQL中计算两个日期的间隔天数
数据库·mysql
始终奔跑在路上1 小时前
linux基础2
linux·网络·数据库·web安全·网络安全
Wh1teR0se2 小时前
sqli_labs-10,11,12 --详细解析
数据库·web安全·网络安全