目录
[一、非空约束not null](#一、非空约束not null)
[五、主键primary key](#五、主键primary key)
[八、外键foreign key](#八、外键foreign key)
一、非空约束not null
如果不对一个字段做非空约束,则默认为空。但空数据无法参与运算,并且我们有时需要禁止用户在某些字段中输入空值,所以实际开发时我们常常需要对一些字段进行非空约束
像这样,在建表时不对字段进行非空约束,且插入时也没有指定数据,则默认为空
如果要禁止某些字段为空,就要像下面这样在数据类型后加上非空约束
输入_desc 表名_查看表的结构:
NULL属性代表某列数据能否为空。可以看到,加入非空约束后,对应字段就不允许为空了,
二、默认值约束default
添加default约束实际上就是为某列数据设置默认值,当未指定列数据则采用该默认值
前面已经可以看到,如果不设置default约束,则字段默认值为NULL。default约束和非空约束并不冲突,如果用户插入的数据是NULL,就看是否有非空约束;如果对应列未插入数据,就看是否有default约束。
添加default约束的方式和非空约束一样:
查看表结构:
可以看到对应字段的Default属性已经被设置为我们指定的默认值了
三、列描述comment
我们在之前已经见过列描述了,其主要用于对一个字段作注释,相当于一个软性的约束
例如:
列描述用于提示用户对应字段的含义,可以通过 show create table 列名 来查看
四、填充零zerofill
zerofill可以在插入的数据小于设定的长度时在前面自动填充前导0
我们在设置数字类型时,可以在类型的后面加上一个长度,例如:
向表中插入一行数据:
可以看到,设置了zerofill属性的字段a,若数据长度小于我们前面设定的长度10,则会在前面添加前导0直到符合设定长度;如果数据位数比设置的长度更大则正常插入,无需添加
实际上在数据库内部存储的数据还是去除前导0后的原始数据,设置zerofill只能让数据格式化输出
五、主键primary key
主键(primary key)用于约束某个字段里面的数据不能重复且不能为空。例如当插入学号数据时,一般是不允许有重复的学号的,因此就可以将该列数据设置为主键
一张表里最多只能有一个主键,且设置为主键的列通常是整数类型。因此主键也用于标识某行数据的唯一性,例如通过学号标识一个学生的唯一性
将某个字段设置为主键的方式有多种,例如:
- 建表时直接指定主键
在查看表结构时,对应字段的Key属性如果为PRI则表明该字段是主键
-
在已创建的表中追加主键约束
alter table 表名 add primary key(列名);
- 用主键字段列表来创建主键
这种方式可以创建复合主键,例如:
此时id和age共同合成一个复合主键,此时只有这两列数据同时重复才会触发主键冲突,否则都是允许插入的
删除主键的方式:
alter table 表名 drop primary key;
可以看到主键约束已经被删除了
在插入数据时,插入重复的主键数据是不被允许的,例如:
如果一个表中已经存在了若干条数据,且某一列中存在重复数据,此时我们不能再对该列添加主键约束
六、自增长auto_increment
自增长属于主键的一种,当某个字段设置自增长时,即便我们在插入时不指定该字段的值,系统也会自动从当前字段已有的最大值进行+1操作得到一个自增长的值。自增长通常与主键搭配使用作为逻辑主键
任何一个字段要做自增长,前提是本身是一个索引,且必须是整数。一张表最多只能有一个自增长字段
例如:
随便插入几个数据,观察自增长字段的变化
我们也可以在插入时指定自增长字段的值,这样在下一次自增时则会以上一次插入的值为基准开始增长
在最初建表时,我们也可以指定自增的初始值
七、唯一键unique
一张表中往往有多个字段都需要保证数据的不重复,但主键只能有一个,因此唯一键就可以解决多个字段需要唯一性约束的问题。
唯一键与主键互补,主键用于标识单条数据在整个表中的唯一性,唯一键用于保证某个字段中数据在这一列的唯一性。例如我们将用户的姓名作为主键标识用户的唯一性,但用户的电话也是不应该重复的,因此我们可以将电话设置为唯一键
唯一键的本质与主键差不多,但唯一键允许数据为空,且不对空数据做唯一性比较(即唯一键可以有多个空数据)
例如:
随便插入几条数据:
可以看到唯一键不允许重复,但不会对null做检测
八、外键foreign key
外键用于定义主表与从表之间的关系。外键约束主要在创建从表时定义,并且与主表的主键约束或唯一键约束关联
例如我们有一个主表存放学校内所有班级的信息,从表存放学生的信息
- 先创建主表,将班级的编号设置为主键
- 再创建从表,将学生学号设置为主键,将学生所属的班级编号与主表中的班级编号进行外键约束关联
设置外键约束的语法:
foreign key (从表字段) references 主表名(主表字段)
我们先向主表中插入几个班级信息
再向从表中插入几个学生信息
可以看到,当学生所属的class_id在主表中的id字段中存在时,是可以正常插入的,但:
当class_id在主表中的id字段中不存在时禁止插入。事实上一个学生也不可能属于一个不存在的班级,因此是符合我们实际业务需要的
外键的数据需要在主表中所关联的对应列中存在,不能插入不存在的数据
但是如果class_id为null,是允许插入的
例如某个学生还没有分配班级,就设置为null
如果某个主键列对应的外键中还有数据,我们是无法直接删除对应的主键数据的,例如:
编号为1的班级中还存在学生的数据,我们就无法把这个班级的数据删除
实际中,很多数据都是存在相关性的。如果两张表在业务上具有相关性,但是没有建立约束关系,就可能导致出现问题,例如一个学生属于了一个不存在的班级。通过外键我们就可以将不同表的两个字段相关联,建立约束关系。
完.