目录
1.约束的概念
MySQL表中的约束(Constraints)是强加于表上的规则,用于限制存储在表中的数据类型,并确保数据的准确性和可靠性。这些约束有助于维护数据的完整性,防止无效数据的插入或更新。
比如有的数据是必填项,就像身份认证的时候,或者填注册信息的时候,手机号身份证这种就不能空着,所以就有了非空约束;又有的数据比如用户的唯一id,不能跟其他人的一样,所以就需要使用唯一约束等等。
2 空属性约束
- 两个值:null(默认的)和not null(不为空)
- 数据库默认字段基本都是字段为空,但是实际开发时,尽可能保证字段不为空,因为数据为空没办法参与运算
案例:
创建一个班级表,包含班级名和班级所在的教室。
站在正常的业务逻辑中:
- 如果班级没有名字,你不知道你在哪个班级
- 如果教室名字可以为空,就不知道在哪上课
所以我们在设计数据库表的时候,一定要在表中进行限制,满足上面条件的数据就不能插入到表中。这就是“约束”。
两个字段都不能为空,否则插入失败
3.默认值约束
默认值:某一种数据会经常性的出现某个具体的值,可以在一开始就指定好,在需要真实数据的时候,用户可以选择性的使用默,使用关键字default
案例
我们创建了t8表,其中age和name都给了默认值,我们进行填充具体的数据就是填充的数据,不填充就给默认的值。
同时给not null和 default
这样会不会冲突呢,not null 表示不为空,如果设置了default该字段本就不为空了,但该字段不能手动给NULL的数据,如果只有default那么该字段是允许给NULL的。
4. 列描述(comment)
列描述:comment,没有实际含义,专门用来描述字段,会根据表创建语句保存,用来给程序员或DBA来进行了解。
案例
当创建表,不知道对应字段的含义时,就可以查看建表命令,查看对应comment对字段的表述信息。
5.补零(zerofill)
显示宽度:当你指定
ZEROFILL
时,通常需要同时指定列的显示宽度(例如INT(5) ZEROFILL
)。但是,需要注意的是,这个显示宽度并不限制值的范围,它只影响值的显示方式。自动填充零:如果列的值在转换为字符串以进行显示时长度小于指定的显示宽度,MySQL 会在其前面填充零直到达到指定的宽度,超过宽度就不会补0.
正数和负数:对于负数,
ZEROFILL
不会自动填充零。因为负号(-)会占用一个字符位置,所以实际的数字部分会相应地向右移动,且不会进行零填充。默认值:如果列有默认值且未指定
ZEROFILL
,则在添加ZEROFILL
后,可能需要重新考虑默认值的设置,以确保它符合预期的显示格式。字符类型不适用:
ZEROFILL
仅适用于数字类型(INT
、BIGINT
、DECIMAL
、NUMERIC
),不适用于字符类型(如VARCHAR
、CHAR
)。假设我们有一个表
employees
,其中有一个列id
被定义为INT(5) ZEROFILL
。如果我们向表中插入一些值:
id
被相应地用零填充以达到指定的宽度。
6.主键约束 (primary key)
主键是表中的一列或多列的组合,用于唯一标识表中的每一行。换句话说,主键列的值必须是唯一的,不能重复,并且表中的每一行都必须有一个主键值(尽管这个值可以是NULL,但在实际使用中,通常不会将主键设置为允许NULL,因为这样会失去主键的唯一性意义)。
主键约束是作用于主键列或列组合上的一种约束,它自动地实施了两个关键的规则:
- 唯一性(Unique):确保表中所有行的主键值都是唯一的。不允许有两行具有相同的主键值。
- 非空(Not NULL):主键列不允许包含NULL值。这是因为如果主键可以包含NULL,那么它就可能无法唯一地标识表中的每一行。
基本案例
主键不可重复
我们还可以根据主键去对数据进行增删查改
主键的删除与添加
删除一张表的主键,因为主键唯一,指的时删除主键约束(而不是删除列本身)
添加主键,本质就是重新加上主键约束,但要保证主键列不可以有重复的数据且数据不为空,否则不能添加成主键
复合主键
一张表中只有一个主键,但主键是可以给多列的——复合主键。
复合主键是数据库表设计中的一个重要概念,它指的是由两个或多个字段(列)共同组成的主键,用于唯一标识数据库表中的每一条记录。
基本案例
我们将学生的id和课程代码为复合主键,这有什么效果呢?
学号为1的同学可以选择E1课程,当然也可以选择E2课程,但是1号同学选了E1课程,就不能再次选择了。也就是说复合主键,只要其中一个列和历史数据不一样的话,都是可以的,但不能两个都和历史数据相同。
复合主键的删除与添加
直接删除主键约束即可
添加主键约束,确保所有主键列每行不能同时出现重复数据且保证数据不为空即可
7. 自增长约束(auto_increment)
自增长(Auto-Increment)约束是一个特性,用于在插入新记录时自动生成唯一的数字,这个数字通常是递增的。它主要用于主键列,以确保每条记录都有一个唯一的标识符。当表中添加新记录而该记录的自增长列未明确指定值时,MySQL会自动为该列赋予一个比当前最大值大1的值(如果该表为空,则通常从1开始)。
在创建表时,可以通过在列定义后添加
AUTO_INCREMENT
属性来添加自增长约束。这个属性通常与PRIMARY KEY
约束一起使用,因为主键列的值必须是唯一的。
- 任何一个字段要做自增长,前提是本身是一个索引(key一栏有值)
- 自增长字段必须是整数
- 一张表最多只能有一个自增长
基本案例
与主键搭配使用
只插入name列,id列自增
你也可以对id进行手动插入,只不过,之后如果插入会从此刻id后自增长,要保证不能插入重复的id
建表时设置起始值
起始如果不设置起始值,auto_increment默认等于1,如果在中间手动插入id,其实就是将auto_increment的值进行了修改。
last_insert_id()
last_insert_id()
是一个在多种数据库系统中都存在的函数或方法,但特别在 MySQL 和一些兼容的数据库(如 MariaDB)中广泛使用。这个函数的主要作用是返回最近一次使用 AUTO_INCREMENT 属性插入到表中的行的 ID 值
8.唯一键 (unique)
一张表中有往往有很多字段需要唯一性,数据不能重复,但是一张表中只能有一个主键:唯一键就可以解决表中有多个字段需要唯一性约束的问题。
唯一键的本质和主键差不多,唯一键允许为空,而且可以多个为空,空字段不做唯一性比较。
关于唯一键和主键的区别:
我们可以简单理解成,主键更多的是标识唯一性的。而唯一键更多的是保证在业务上,不要和别的信息出现重复。乍一听好像没啥区别,我们举一个例子假设一个场景(当然,具体可能并不是这样,仅仅为了帮助大家理解) 比如在公司,我们需要一个员工管理系统,系统中有一个员工表,员工表中有两列信息, 一个身份证号码,一个是员工工号,我们可以选择身份号码作为主键。 而我们设计员工工号的时候,需要一种约束:而所有的员工工号都不能重复。 具体指的是在公司的业务上不能重复,我们设计表的时候,需要这个约束, 那么就可以将员工工号设计成为唯一键。 一般而言,我们建议将主键设计成为和当前业务无关的字段,这样,当业务调整的时候, 我们可以尽量不会对主键做过大的调整。
也就是说,一个人身上有多个属性,很多属性也都是具有唯一性的,需要做唯一键的约束,而主键,就是从众多的唯一性中选出来作为主键的,主键和唯一键不冲突,而是互为补充的。
基本案例
我们将id设置为主键,学号为唯一键
由于02学号已被占用,学号被设置唯一键,不可以存在重复的值,因此再次插入02失败。
被设置唯一键的字段是允许为空的,且设置为空字段不做唯一性比较
9.外键约束
外键用于定义主表和从表之间的关系:外键约束主要定义在从表上,主表则必须是有主键约束或unique约束。当定义外键后,要求外键列数据必须在主表的主键列存在或为null。
语法:
foreign key (字段名) references 主表(列)
学生表依附于班级表,所以我们将学生表称之为从表,班级表我们称之为主表。class_id这一列是用于与另一个表产生关联关系的,所以我们称class_id为外键
案例
创建一个学生表(从表),class_id字段已被设置成外键
创建一个班级表
给class表插入数据
给student插入数据,我们选择课程id为1,2的时候,是可以插入成功的,插入其它id号,就会发生外键约束,MySQL拦截此操作
对class表中id为1进行删除,此时是不能删除的,因为从表中外键还存在此id
如果我们把从表中外键为1的行删除,再做上面操作,就是被允许的
外键:1.是从表和主表的关联关系 2. 产生外键约束