MySQL 中表的约束 -- 空属性,默认值,主键,自增长,唯一键,外键
目录
1. 空属性
2. 默认值
3. 列描述
4. zerofill
5. 主键
6. 自增长
7. 唯一键
8. 外键
真正约束字段的是数据类型,但是数据类型约束很单一,需要有一些额外的约束来更好的保证数据的合法性,业务角度上看用于保证数据的正确性。约束本质是通过技术手段保证用户插入正确的数据。
1. 空属性
两个值:null(默认的)和 not null(不为空)。
数据库默认字段基本都是字段为空,但是在实际开发中,尽可能保证字段不为空,因为数据为空没有办法参加运算。
下列属性中的 Null 为 NO 表示插入时该字段不能为空,Null 为 YES 时,表示插入时该字段可以为为空。
当插入时,不对 class_room 字进行插入,就会插入默认值,这里报错是说没有默认值,所以插入失败。
这里对 class_room 插入 null,会报错说 class_room 不能为 null。 这就叫做非空约束。
2. 默认值
default:某一字段会经常性的出现某个具体的值,可以在一开始就指定好该字段的默认值,在需要真实数据的时候,用户可以选择性的使用默认值。
使用 show create table 表名 查出来的 name 字段是没有默认值的,而 desc 表名 查出来的是 name 字段默认值为 null。这里就有冲突,这时候以 show create table 表名 查出来的为准。
在创建的时候设置 default 值,在查看表属性的时候 default 就是用户指定的值。
插入时,当用户没有对有默认值的字段进行插入,则就会使用默认值进行填充。
如下图所示,name 字段没有默认值,所以在插入的时候没有明确指定 name 字段,插入失败。
知识点1:
如果某一字段没有设置 default 值,那么在插入的时候必须明确指定该列的列名称进行插入,否则插入失败。如果某一字段设置 default 值,那么在插入的时候可以不用指定该列的列名称进行插入,默认有 default 值进行填充。换句话说,default 属性没有在插入时必须指定列名。
3. 列描述
comment:没有实际含义,专门用来描述字段,会根据表创建语句保存,用于用户来进行了解。
注:通过 desc 表名 是查看不到注释信息的,必须通过 show create table 表名 查看。
4. zerofill
zerofill 是一种显示上的约束,zerofill 的作用就是,如果数值类型宽度小于设定的宽度(数据类型后面的数字,比如:int(10)),自动填充 0。但是在数据库中存储的值没有改变,只是显示进行了格式化显示。添加 zerofill 约束之后,数值类型会变为 unsigned 类型。
5. 主键
主键:primary key 用来唯一的约束该字段里面的数据,不能重复,不能为空,一张表最多只能有一个主键(不意味着主键只能添加给一列,一个主键可以被添加到一列或者多列);主键所在的列通常是整数类型。
如上图所示,在进行表的创建时,指定了 id 添加主键,则会自动将其设为非空且 key 属性设为 PRI。
如上图所示,当表中有了主键为 1 的数据时,再插入 主键为 1 的数据就会插入失败,所以主键可以用于表示表中一条数据的唯一性。
当表创建好但是没有主键的时候,可以添加主键
alter table 表名 add primary key(字段列表);
注:如果添加主键的那一列有重复的值,则添加主键会失败。
删除主键
alter table 表名 drop primary key;
复合主键
这里表示 id 和 course_id 合起来为一个主键,如果其中只有一个字段重复,是可以进行插入的。
上述表表示,同一名学生不能同时选两门相同的课,不同的学生可以选相同的课,同一名学生可以选多门不同的课。
复合主键在创建表的时候或者添加时就必须一次指定好哪几列为主键,不能给一列添加主键之后再给另外一列添加主键。
如上图所示,这时候 id 和 course_id 已经是主键了,将 score 添加主键就会失败。
6. 自增长
自增长(auto_increment):当对应字段不给值会自动的被系统触发,系统会从当前字段中已经有的最大值进行 +1 操作,得到一个新的不同的值。通常和主键搭配使用,作为逻辑主键。
任何一个字段要做自增长,前提是本身是一个索引(key 一栏有值),并且自增长字段必须是整数且一张表最多只能有一个自增长。
如下图,当进行插入的时候不指定 id,则默认会j将表中已有的最大值 +1 作为新数据该字段的值。
如下图所示,表的属性信息中有一个 auto_increment 属性,表示下次再插入数据时,自增长的值为多少。 这个值也可以进行手动的设置。
7. 唯一键
一张表中往往有很多字段需要唯一性,但是一张表中只能有一个主键,唯一键可以解决表中有多个字段需要唯一性约束的问题。
唯一键的本质和主键差不多,唯一键允许为空(可以通过对空属性进行设置,使其不允许为空),而且可以允许多条数据为空,空字段不做唯一性比较。
0 0 上述的 unique 也可以写成 unique key。
唯一键和主键的区别:
主键更多的是标识这一条数据的唯一性。而唯一键更多的是标识某一字段的唯一性。就比如身份证号和邮箱号,一个人的身份证号用于标识这个人的唯一性,而邮箱号表示这个人的邮箱,可以没有,也不能对这个人进行唯一性标识,但是邮箱号是不可以重复的。上述中的身份证号和邮箱号的区别就可以对应看成主键和唯一键的区别。
8. 外键
外键用于定义主表和从表之间的关系,外键约束主要定义在从表上,主表则必须有主键约束或唯一键约束。当定义外键后,要求外键列数据必须在主表的主键列存在或为 null。
foreign key (字段名) references 主表(列)
如上图所示,主表为 class,从表为 student。从表中的 class_id 字段受到外键约束。当对 student 表中插入一个 class_id 不属于 主表 class 中 id 列中的数据,则会插入失败。
如下图,当前 class 表中有 id 为 1 和 2 的班级,当向 student 中插入数据时,class_id 字段没有在 class 表的 id 中存在,则会插入失败。如下图中插入赵六的数据。
当 student 表中还存在 班级为 1 的学生时,删除 class 表中 id = 1 这一行数据也是不行的。