【MySQL】:表的约束

朋友们、伙计们,我们又见面了,本期来给大家带来数据库表的约束知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成!

C 语 言 专 栏:C语言:从入门到精通

数据结构专栏:数据结构

个  人  主  页 :stackY、

C + + 专 栏   :C++

Linux 专 栏  :Linux

目录

1. 空属性

2. 默认值

3. 列描述 

4. zerofill

5. 主键

5.1 复合主键 

5. 自增长

6. 唯一键

7. 外键


  • 通过对表的约束,让我们插入数据库表中的数据都是符合预期的;
  • 约束的本质就是通过技术手段让操作者插入正确的数据;
  • 同样的,站在MySQL的视角,凡是插入进来的数都是符合数据约束的;
  • 约束的最终目的:保证数据的完整性和可预期性!

1. 空属性

  • 空属性分为为空(null)和不为空(not null)两个值;
  • 数据库默认字段基本都是字段为空,但是实际开发时,尽可能保证字段不为空,因为数据为空没办法参与运算(数据与空运算都为空)。

示例:创建一个班级表,包含序号、班级名和所在教室;

正常的逻辑班级名和教室都是不能够为空的,所以我们直接在这两个字段后面用not null进行修饰,即表示这两个字段不能为空:

所以我们在设计数据库表的时候,一定要在表中进行限制,不满足约束条件的数据就不能插入到表中。这就是“约束”。

2. 默认值

默认值:某一种数据会经常性的出现某个具体的值,可以在一开始就指定好,在需要真实数据的时候,用户可以选择性的使用默认值。

默认值的生效:数据在插入的时候不给该字段赋值,就使用默认值

此时我们再反过来看一下空属性这里的例子,这里的报错显示的是该字段没有默认值:

所以default和not null不冲突,而是一种相互补充的状态!

注意:not null和defalut一般不需要同时出现,因为default本身有默认值,不会为空。

3. 列描述 

列描述:comment,没有实际含义,专门用来描述字段,会根据表创建语句保存;
可在字段后面添加comment进行注释:

使用show查看创建表语法细节可以看到表字段的注释:

4. zerofill

数据类型章节中的数值型后面的长度没有解释,int(10)代表什么意思呢?

其实没有zerofill这个属性,括号内的数字是毫无意义的,接下来我们通过zerofill来演示一下:
① 向表中插入数据

② 向其中一列添加zerofill属性

③ 再次查询结果

这次可以看到a的值由原来的1变成0000000001,这就是zerofill属性的作用,如果宽度小于设定的宽度(这里设置的是10),自动填充0。要注意的是,这只是最后显示的结果,MySQL中实际存储的还是1。

如果将宽度改为4,我们插入一个5位数甚至更多的数呢?

所以当数据的宽度小于设定宽度,在zerofill的修饰下会填0补充并显示,大于设定的宽度时就按照原数据显示,并不会影响存储。

结论:

  • int(10)这里的10表示的是显示宽度; 
  • zerofill不会影响数据的存储,只是一种格式化的输出;
  • 有符号和无符号的数值类型宽度不一样,有符号的需要多用一个宽度存储符号位

5. 主键

主键:primary key用来唯一的约束该字段里面的数据,不能重复,不能为空,一张表中最多只能有一个;主键所在的列通常是整数类型。

创建表的时候直接在字段上添加primary key指定主键

主键约束:主键对应的字段中不能重复,一旦重复,操作失败。

  • 当表创建好以后但是没有主键的时候,可以再次追加主键
alter table 表名 add primary key(字段列表)

注意:如果表中以存在两个相同的数据,那么是不能添加主键的。

  • 删除主键 
alter table 表名 drop primary key;

5.1 复合主键 

在创建表的时候,在所有字段之后,使用primary key(主键字段列表)来创建主键,如果有多个字段作为主键,可以使用复合主键

注意:复合主键不是两个主键,而是两个字段合起来构成一个主键!

5. 自增长

auto_increment:当对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值+1操作,得到一个新的不同的值。通常和主键搭配使用,作为逻辑主键。
自增长的特点:

  • 任何一个字段要做自增长,前提是本身是一个索引(主键)
  • 自增长字段必须是整数
  • 一张表最多只能有一个自增长

当我们向表中插入数据时,id字段没有指定就会从1开始自动增长,如果给定了值,下次插入就会从这个值增长:

 

 我们也可以通过SQL语句来获取上次插入的AUTO_INCREMENT值(批量插入获取的是第一个值):

select last_insert_id();

我们也可以自定义自增长的起始值,首先可以先用SQL语句查看建表细节:

所以我们可以在建表时设置特定自增长字段的初始值,或者是在表建立好之后修改自增长值:

6. 唯一键

  • 一张表中有往往有很多字段需要唯一性,数据不能重复,但是一张表中只能有一个主键;唯一键就可以解决表中有多个字段需要唯一性约束的问题。
  • 唯一键的本质和主键差不多但是唯一键允许为空,而且可以多个为空,空字段不做唯一性比较。
  • 主键更多的是标识唯一性的。而唯一键更多的是保证在业务上,不要和别的信息
    出现重复。

示例:一个学生表中首先要有学号、身份证号来标识该学生的唯一性, 但是要联系该学生的电话号也是需要唯一的,所以就需要唯一键来让不同的学生的手机号不能重复

创建表:

插入数据:

7. 外键

外键用于定义主表和从表之间的关系:外键约束主要定义在从表上,主表则必须是有主键约束或unique约束。当定义外键后,要求外键列数据必须在主表的主键列存在或为null。
强调了表和表之间的关联,表和表之间的约束。

语法:

foreign key (字段名) references 主表(列)

示例:① 先创建主键表

create table myclass (
    id int primary key,
    name varchar(20) not null 
);

② 再创建从表并建立外键约束

create table stu (
    id int primary key,
    name varchar(30) not null,
    class_id int,
    foreign key (class_id) references myclass(id)
);

③ 插入数据

insert into myclass values(10, 'C++'),(20,'Java');
insert into stu values(101,'张三',10),(102,'李四',20);
insert into stu values(103,'王五',null);

④ 非法插入

insert into stu values(103,'王五',30);

建立外键的本质其实就是把相关性交给mysql去审核了,提前告诉mysql表和表之间的约束关系,那么当用户插入不符合业务逻辑的数据的时候,mysql不允许你插入。

朋友们、伙计们,美好的时光总是短暂的,我们本期的的分享就到此结束,欲知后事如何,请听下回分解~,最后看完别忘了留下你们弥足珍贵的三连喔,感谢大家的支持!      

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

stackY、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值