初识MYSQL —— 表的约束
前言
了解了mysql
中是数据类型,我们会发现,数据类型本身也是一种约束,确保数据库中存储的数据合法性。
但是数据类型约束单一,还需要一些额外的约束来确保数据的合法性,从业务逻辑角度上保证数据的正确性。
空属性
在创建表时,我们可以设置字段(列)是否能够为null
。(默认是null
,设置not null
字段不能为空)
数据库默认字段都是字段为空,(在实际应用中,尽量不要让字段为空)
例如 : 创建一个课表,其中记录了课程名和教室号(还包含其他属性,时间、教师等等)。
在逻辑上理解:
- 如果课程名为空,就不知道要上什么课;
- 如果教室号为,就不知道要去哪里上课。
在设计表时,就要加上一定的限制(不为空),这样错误的数据就不能插入到表中。(表中的数据一定是正确的)
这里如果忽略字段,错误是没有
default
值(默认值);
默认值
对于默认值,简单来说就是:用户在插入数据时,忽略字段,此时就会使用默认值。(不设置默认值,默认值为NULL
)
在插入数据时,如果用户给该字段赋值,就使用用户输入的值;
如果没有给该字段赋值,就使用默认值(
default
)
此外,在插入时,如果忽略字段并且没有默认值,插入就会报错。(设置not null
就没有默认值)
列描述
comment
列描述,没有实际含义,用来描述字段。
zerofill
通过学习数据库相关操作,我们知道char
、varchar
、float
、decimal
后面括号中数字的含义;但是整数类型(如int
)后面括号中数字的含义又是什么意思呢?
没有设置zerofill
的情况下,该数字是没有任何意义的。
zerofill
的作用就是0
填充,而int
后面括号内的数字则表示位数(数据总位数)。例如,
int(10)
,数据100
查询出来的就是:0000000100
。
可以看到,
int(4)
设置了zerofill
,数据不足4
为就在前面填充0
。数据超过了
4
位,就显示原数据。
默认情况下有符号int
后面数字是11
,无符号int
后面数字是(10)
。
主键
主键:primary key
,唯一约束该字段里面的数据,不能重复,不能为空;一张表中只能存在一个主键
1. 创建主键
可以在创建表时,直接在字段上指明主键:
id tinyint unsigned primary key
也可以在创建表时最后指明主键:
primary key(id)
这里创建表时,在字段后面指明主键,而使用
show create table
查看创建表语句,可以发现还是在字段最后,表明主键。
如果在创建表时,没有指明主键,也可以追加主键
alter table 表名 add primary key(字段名)
2. 删除主键
一张表只能存在一个主键,在添加主键时需要指明字段,而在删除主键时不需要指明主键字段。
alter table 表名 drop primary key
3. 主键约束
主键对应的字段不能重复,一旦重复,操作失败。
4. 复合主键
一张表只能有一个主键,但是主键不一定是某一个字段,主键也可以是多个字段组成(复合主键)。
例如:学生选课成绩表,一个学生会选多门课程,一门课程也会有多名学生选择。(在这张表中,主键就应该是学生id和课程id)
自增长
auto_increment
,当对应字段在插入时没有给值,系统就会从当前字段已有数据的最大值+1
得到一个新的值。
- 一个字段要做自增长,前提是该字段是一个索引
- 子增长字段必须是整数
- 一张表只能存在一个自增长字段
唯一键
主键可以保证一张表中某一字段的唯一性,主键只能用一个;
但是在实际应用场景中,一张表中往往有多个字段需要保证唯一性,这是就需要唯一键来保证字段的唯一性约束。
唯一键和主键类似,唯一键可以为空,可以存在多个NULL
,NULL
不做比较。
定义唯一键约束,需要使用unique
关键字。
外键
主键是一张表中的唯一字段,但是在现实场景中,在多张比表中可能存在统一字段,这些表中就存在一定的关联。
例如:班级信息表和学生信息表,其中都应该存在班级编号这一字段。
外键:用来定义主表和从表之间的关系;
外键约束主要定义在从表上,主表则对应字段必须是有 主键或者 唯一键约束。
语法:
foreign key (字段名) references 主表(列)
主表是被引用的表,从表是引用别人的表。
外键的使用:
这里定义两张表:学生表、班级表。
学生表中存在字段class_id
,该字段引用班级表中字段id
。
这里班级表是主表,而学生表是从表。
在定义表结构时,要先创建主表,再创建从表(定义外键时,主表一定是已经存在的)
创建完表结构之后,向表中插入数据:
可以直接向主表cla
中插入数据;
向从表中插入数据时,如果外键字段的数据在主表中不存在,就会插入失败
所以,外键约束(Foreign Key)是保证两张表之间数据一致性的一种规则。
在上述操作中,向
stu
表中插入数据,但是主表cla
中不存在班级id为15
的数据;插入失败。就相当与现在有一个学生,它是
15
班的,但是在学校中根本就不存在15
班。
两张表在业务上是有相关性的,但是在业务上没有建立约束关系,那么就可能出现问题 。
外键用于定义主表和从表之间的关系:外键约束主要定义在从表上,主表则必须是有主键约束或unique约束。当定义外键后,要求外键列数据必须在主表的主键列存在或为null。
此外,要删除主表中的某条数据,
id
字段数据为10
,如果从表中存在外键为10
的数据,就无法删除。