- 什么是约束?
约束就是对插入的数据进行一定的限制。数据的类型本质就是一种约束,但这里我们要讲其他一些约束条件的设置。
- 为什么有了数据类型还不够,还需要有其他的约束?
这主要是因为在具体的应用场景中,光光是通过类型对数据的大小进行限制是完全不够的,还需要有一些其他的限制,更好的保证数据的合法性,如数据不能为空,数据需要保持唯一性,设置默认值等等。
表的约束很多,这里主要介绍如下几个: null/not null,default, comment, zerofill,primary key,auto_increment,unique key 。
一、空属性
- 两个值:null(默认的)和 not null(不为空)
- 数据库默认字段基本都是字段为空,但是实际开发时,尽可能保证字段不为空,因为数据为空没办法参与运算。
说明:
- null参与的运算结果都为null,所以null无法进行运算
- 可以在设置字段时,加上not null 表示当前字段不能为null
- null表示不插入内容,' '(单引号内没有字符)表示插入内容,但内容为空,两者在mysql中是不同的
二、默认值
默认值:某一种数据会经常性的出现某个具体的值,可以在一开始就指定好,在需要真实数据的时候, 用户可以选择性的使用默认值。
说明:
- 如果插入的数据的某些字段被设置有默认值,那么在插入时,如果不主动填写这些字段,会用设置的默认值
- 字段默认设置的默认值就是null
三、列描述
列描述: comment ,没有实际含义,专门用来描述字段,会根据表创建语句保存,用来给程序员或 DBA来进行了解。
说明:
- 列描述的作用和代码中的注释一样,并不具有硬性的限制,只是具有提示/解释功能
- 列描述无法在表结构中看到,只能通过查看表的创建语句看到(随便说一下为什么数据库中记录的创建表的语句和我们写的不同,因为被数据库优化过了,比如大小写的变化,默认值的设置,引擎的选择,字符集的选择等,都是数据库根据配置文件给我们添加的)
四、zerofill
zerofill主要和无符号整数有关,很多人在认识数据库类型时,对 int(10) unsigned 中的这个数字很不理解,它的用处就是和zerofill进行搭配使用,实现填充零的作用,如下
说明:
- zerofill 和 int(5) unsigned中的数子进行配合,如果插入数字的宽度少于5,则补0,如果多余5个就不用管了,本质是一种格式化表示,并没有改变实际的值
- zerofill 会将整数默认设置为无符号数,zerofill只和整数类型搭配使用
五、主键
主键: primary key 用来唯一的约束该字段里面的数据,不能重复,不能为空,一张表中最多只能有一个主键;主键所在的列通常是整数类型,如下
- 创建表的时候直接在字段上进行指定主键,主键的值不能重复
- 可以往一个没有主键的表上追加主键(前提是该表要被设置为主键的字段上的数据不能重复)
alter table 表名 add primary key(字段名);
- 删除主键
alter table 表名 drop primary key;
-
复合主键:在创建表的时候,在所有字段之后,使用primary key( 主键字段列表 ) 来创建主键,如果有多个字段作为主键,可以使用复合主键
六、自增长
auto_increment :当对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值 进行+1操作,得到一个新的不同的值。通常和主键搭配使用,作为逻辑主键。
自增长的特点
- 任何一个字段要做自增长,前提是本身是一个索引(key一栏有值)
- 自增长字段必须是整数
- 一张表最多只能有一个自增长
说明:
- 自增值默认从1开始
- 下一个插入的数据的自增值字段,默认是当前字段数据中的最大值+1,如果插入的是负数,自增值不会变化
- 可以通过查看表的创建语句来查看自增值
-
last_insert_id() --- 在插入后获取上次插入的 AUTO_INCREMENT 的值(批量插入获取的是第一个值)
索引:
- 在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。
- 索引提供指向存储在表的指定列中的数据值的指针,然后根据你指定的排序顺序对这些指针排序。数据库使用索引以找到特定值,然后顺指针找到包含该值的行。这样可以使对应于表的SQL语句执行得更快,可快速访问数据库表中的特定信息
七、唯一键
- 一张表中有往往有很多字段需要唯一性,数据不能重复,但是一张表中只能有一个主键,所以需要有 唯一键 来解决表中有多个字段需要唯一性约束的问题。
- 唯一键的本质和主键差不多,唯一键允许为空,而且可以多个为空,空字段不做唯一性比较
八、外键
外键用于定义主表和从表之间的关系:外键约束主要定义在从表上,主表则必须是有主键约束或 unique 约束。当定义外键后,要求外键列数据必须在主表的主键列存在或为null 。
- foreign key (字段名) references 主表(列)
说明:
myclass表为主表,students表为从表,当我们向students表中插入数据时,学生数据中的所在班级编号必须要出现在myclass主表中,否则不允许插入,但允许为空,这也符合我们的认知,因为一个学生,他要么是被分配在已知的班级,要么是在等待被分配,但不能分配给一个不存在的班级,故如果要想插入这个在班级编号为30的学生,首先得创建编号为30的班级,这也是外键的意义所在,从逻辑顺序上约束我们插入数据的合法性,当然我们也无法删除一个有学生的班级。这就是外键约束所带来的效果。