MySQL -- 表的约束

概念引入:真正的约束表字段的是数据类型,但是数据类型的约束方式比较单一的,所以需要一些额外的一些约束,用于表示数据的合法性,在只有数据类型一种约束的情况下,我们比较难保证数据是百分百合法。通过添加不同的约束,我们就可以确保未来插入数据库表中的数据是符合预期的。而约束的本质其实就是通过技术手段让程序员插入正确的数据。反过来,站在数据库的角度,凡是插入进来的数据,均为符合数据约束的。而约束的最终目的就是保证数据的完整性和可预测性,因为数据库是保存用户数据的最后一道防线。

1 、约束的常用类型

1.1 空属性

空属性约束其实还是比较常见的,我们在表中就经常可以看见,比如

上图中的NUll,其实就是空属性,如果没有设置,我们一般默认为可以空。

在我们存储的数据中很多其实是不可以为空的,所以这就是为什么很多网页需要你注册身份信息时,很多项其实是必填项。数据库在存储这类数据时,也会设置空属性的约束,确保一些信息不为空。下面用一些图来演示一下

a.创建表

设置三个变量,班级和教室不为空,其他可以为空

b.插入正常数据

这里我们插入非空数据,发现没有问题。

c.插入缺失的数据

这里我们不插入others ,说明others默认就是可以不为空

d.继续插入缺失数据

当我们继续插入缺失数据时,我们可以发现,如果将设置为not null 类型的数据空插会导致数据对其进行拦截。

1.2 默认值

默认值这条约束其实非常简单,就是在插入的时候,设置某一行的值,系统会自动帮忙补上。设置default值也非常简单,只需要在创建表时,在类型后加上设置的默认值,**例:create table t1 ( age tinyint unsigned default 18);**另外我们还可以将not null与default搭配使用,确保插入数据不为空,不过这两个一般不一起使用

1.3 列描述

这种约束其实无法通过desc命令来显示,实际上这就相当于是一种注释,用于给程序员或DBA进行了解。

在上图明显可以发现,desc命令显示不出comment的内容.想要看见就需要使用show create table name /G命令,结果如下图

1.4 zerofill

这种约束其实是用于改变表中的数字表现形式,就比如,**数据类型为int(10)**这里的10就表示插入表时,如果插入数据不足十位的话会自动补零,但是如果超过十位了,那么该是多少就是多少。

插入后

需要注意的是,如果我们没有显示的设定数据类型的宽度但是加了zerofill属性,这里int会默认的显示宽度是11,unsigned int 是10,符号位也占一个宽度。这种显示方式并不会影响数据库对数据的存储与操作。

1.5 主键

主键在一张表中具有唯一属性,通常我们就可以看成和操作系统的pid一样,用于标识数据,我们在创建表时,可以在表后加上primary表示设置该类型为主键。例如下图:

这里的id Key就是PRI,表示唯一。当我们插入同样的id值时,就会出现一些问题。同时,当原有的表中没有主键约束的时候,可以插入多个重复id数据,如果此时你想要为id加上约束,数据库就会对你的操作进行拦截,只有你把相同的id数据删除时,才可以重新设置约束<,所以我们一般约定,在表创建的时候就设定主键

我们可以发现,当再次插入id为2的数据时,我们就会发现,数据库会进行拦截。那么是不是没有办法插入相同的id数据了呢?当然不是,这里虽然主键只能有一个,但是一个主键可以附加在多列上。例如,我们可以让id和sore一起作为键值,这样id为2的数据就可以重复地插入。
下面把原来的主键删除,设置新的主键

尝试插入相同的id/score值,两列数据做键值时,也不能插入两列一样的值。

1.5.1 自增长

自增长这个属于主键的一种额外特性,这个自增长需要和主键搭配使用,而且只能有一列享有自增长这个属性。自增长顾名思义就是自动会增长,当我们第一次插入了数据。如果有一列有是主键并有自增长属性,那么后面假设不插入这列数据,数据库也会自动帮你补上。**例如: 当我们将id设置成主键并加上自增长这个特性的话,我们会发现,哪怕我们第一次插入数据时没有设定id值,数据库也会默认帮我们补上0(一般默认是零,可以另外设置)。**后续插入数据还没有设置的话,会自动补上并增长大小,以确保唯一性。当然,如果你中间突然显示插入一个id = 1000 的数据,那么下次默认补齐的id就从1001开始,这是因为表中会自动记录下次自增长的值。下面用几张图来举例,方便理解

先创建一个带自增长属性的表

不断插入数据,观察是否带其中一列数据是否自增长

我们可以发现,数据确实在自行增长,并在我们主动设置数据后,会在主动设置的数据后增长。

数据库会自动记录下次的auto_increment需要增长到的值

1.5.2 唯一键

唯一键和主键在功能上非常类似,唯一键是用于解决表中的唯一性约束问题。主要是因为每一张表只能拥有一个主键,但是我们还有许多的属性都需要唯一性的约束。所以唯一键的存在就变得合理了,唯一键和主键虽然在功能上非常相似,但在一些细节上还是有差异的。例如主键是不能为空,而唯一键可以为空。唯一键的主要作用就是为了保证不和别的信息出现重复。 一般我们在创建表时,在一条数据类型后加上unique即可即可

1.5.3 外键

外键(Foreign Key)是数据库中用于建立表之间关系的一种约束,这种约束其实还是非常常见的,如下图

外键的存在可以确保数据之间存在较好的关联性,就比如上图中,我们是没有办法在最上面那张表中插入别的球员,因为下面的表中并没有其他球员的信息。当然,外键也是可以为NULL,如果外键列允许NULL,则子表中的记录可以不与主表中的任何记录相关联。一旦主从表关联了,对应关联的数据中,子表中插入的主表必须存在,否则会报错,下面用一小段代码来演示主从表之间如何建立联系。

c 复制代码
-- 主表(父表)
CREATE TABLE departments (
    department_id INT PRIMARY KEY,
    department_name VARCHAR(255)
);

-- 子表(从表)
CREATE TABLE employees (
    employee_id INT PRIMARY KEY,
    employee_name VARCHAR(255),
    department_id INT,
    FOREIGN KEY (department_id) REFERENCES departments(department_id)
);

外键也是可以有名称的,如果没有设置,数据库会自动设置。

相关推荐
野猪亨利66722 分钟前
Qt day1
开发语言·数据库·qt
siriuuus33 分钟前
Linux MySQL 多实例部署与配置实践
linux·运维·mysql
本就一无所有 何惧重新开始39 分钟前
Redis技术应用
java·数据库·spring boot·redis·后端·缓存
isaki13742 分钟前
qt day1
开发语言·数据库·qt
流星白龙1 小时前
【Qt】4.项目文件解析
开发语言·数据库·qt
小钻风33661 小时前
HTTPS是如何确保安全的
网络·数据库
王木风1 小时前
1分钟理解什么是MySQL的Buffer Pool和LRU 算法?
前端·mysql
CryptoPP1 小时前
获取越南股票市场列表(包含VN30成分股)实战指南
大数据·服务器·数据库·区块链
阿巴~阿巴~3 小时前
Redis重大版本演进全解析:从2.6到7.0
服务器·数据库·redis·ubuntu·缓存·centos
qq_404643343 小时前
MySQL中RUNCATE、DELETE、DROP 的基本介绍
数据库·mysql