本期博客我们来搞定MySQL中对表的常用约束
目录
一、约束的概念
表的约束:表中一定要有各种约束,通过约束,让我们未来插入数据库表中的数据是符合预期的。约束本质是通过技术手段,倒逼程序员,插入正确的数据。
约束的最终目标:保证数据的完整性和可预期性
真正约束字段的是数据类型,但是数据类型约束很单一,需要有一些额外的约束,更好的保证数据的合法性,从业务逻辑角度保证数据的正确性。
所以在下面我们正式来讲解对表常用的约束,以及怎样使用这些约束:
二、常用约束
2.1 非空约束
数据库默认字段基本都是字段为空(NULL),但是实际开发时,因为某些特定场景要求数据不能为空,这时我们会用到约束语句:
NOT NULL
我们可以在创建表时在具体的列属性后面加上该语句,让该列的数据不能为空:
上面我们创建了t1这个表,该表内有三个数据类型都是varchar(20)的列 class_name、class_room、other,但是class_name、class_room都有not null的非空约束,而other并没有该约束,下面我们来插入数据试试看:
我们可以看到不向other列插入数据时默认可以为NULL
现在我们尝试不向class_name和class_room插入数据试试看:
因为该两个列不能为空,所以在我们想避开其一或者其二向其他列插入数据时系统报错了
但是这个报错有点奇怪:doesn't have a default value
这个报错涉及到default(默认值),下面会进行讲解
如果我们直接插入NULL话,就可以看到很正常的报错了:
2.2 默认值
某一种数据会经常性的出现某个具体的值,可以在一开始就指定好,在需要真实数据的时候, 用户可以选择性的使用默认值
我们使用default关键字来设定数据的默认值:
default 默认值
下面我们来演示 一下:
我们向这个表插些数据试试看:
*
从本次插入我们可以看到这次只插入了一个name列的数据,不过age和sex列也有了数据,仔细看一看该两列的数据是default后面的默认值
我们继续插入数据来实验:
这次插入数据时,我们对每一列都传入了数据,这时可以看到age和sex这两列的值是我们传入的数据而不是default后面的默认值了
所以当用户插入数据时,default的作用是用户有具体的数据就用用户的,没有就用默认值。(类似C++中缺省值)
接下来我们对not null和default两个约束来做一下分析:
这一次我们只对age和sex这两列进行插入,然后系统给报一个上述这样的错误,这是因为当用户插入数据时如果忽略了某一列时,如果该列设置了default就使用默认值,如果没有设置就直接报错
继续插入数据:
从上面两次插入数据的例子我们可以看出not null和default是相互补充的,not null是检查插入的数据是否为null,default是决定是否在插入时使用默认值(并不对null进行检查)
2.3 列描述
comment '要描述的属性'
我们一般使用comment来对列做一些描述,没有实际含义,专门用来描述字段,会根据表创建语句保存,用来给程序员来进行了解。
例如:
2.4 zerofill
我们可以使用zerofill约束来格式化显示整形数据
下面来进行示范:
我们先创建一个表:
我们看到创建的int类型的数据系统优化过后后面有(11),其实没有zerofill这个 属性,括号内的数字是毫无意义的,这个我们慢慢来看
现在向里面插入一些数据:
接着我们将b列加上zerofill约束:
这时打印出来的数据就变得不一样了:
在这里我们可以看到zerofill约束过后,数据位数未达到创建语句()中的值时,会自动在前面补0,从而达到格式化显示
下面我们继续修改一下b列的数据类型:
再向里面插入些数据:
这一次打印时,我们可以看到当受到zerofill约束时,如果数据位数未达到创建语句()中的值时,会自动在前面补0,超过了则不会
在这里要声明一点zerofill约束只会改变数据打印的格式,并不会对数据存储造成影响
2.5 主键
主键(primary key):用来约束字段里面的数据,不能重复,不能为空,一张表中最多只能有一个主键;主键所在的列通常是整数类型。
2.5.1 创建主键
创建主键我们有两种方式
第一种:在列中使用primary key关键字声明:
第二种:在所有列属性创建好后使用primary key()声明主键是哪一列:
2.5.2 删除表中的主键
alter table 表名 drop primary key;
2.5.3 追加主键
当表创建好以后但是没有主键的时候,可以再次追加主键:
alter table 表名 add primary key(字段列表名);
2.5.4 复合主键
一张表只能有一个主键,但不意味着一个表中的主键只能添加给一列!
一个主键可以被添加到一列,或者多列上构成复合主键
复合主键所包含的列共同构成一个数据的整体
下面我们来进行复合主键的演示:
可以看到上面的这个表主键有id和age这两个列,下面来插入数据:
我们可以看到被设为主键的列的数据是被视为一个整体的,只有插入的数据合起来和历史数据重复才会不允许插入。
2.5.5 主键使用实例演示
下面我们创建一个带有主键的表:
现在向这个表中插入些数据:
从上面例子插入'王五'中例子中可以看到:主键对应的字段中不能重复,一旦重复,操作失败
下面我们删除这个表中的主键:
这时id列的数据就可以重复了:
如果这时我再追加id列为主键,会出现一个问题:
如果要追加主键的列有重复数据的话是不能成功的
所以我们最好再建表是就设好主键,不推荐存有数据后再追加主键
2.6 自增长
我们可以设置一个列,当我们插入数据时可以不给这一列值,但是会被系统自动触发,系统会从当前列中已经有的最大值 +1操作,得到一个新的不同的值,最后再将该值连同传入的数据一起插入到行中。
被设置了自增长的列都具备这样性质,我们可以用关键字auto_increment来设置,要主键搭配使用,作为逻辑主键。
自增长的特点:
任何一个字段要做自增长,前提是本身是一个索引(key一栏有值)
自增长字段必须是整数
一张表最多只能有一个自增长
下面来进行演示:
我们创建了一个表,含有自增长列id,下面开始插入数据:
可以看到即便我们不对自增长列进行数据的插入,但是系统会自动填充数据
接下来我们试试看对自增长列插入数据:
可以返现要想对自增长列插入数据也是可以的,那么下面我们不继续对该列进行数据插入,那么系统会怎么填充数据呢?
可以看到系统会从当前列中已经有的最大值+1来填充数据
但是我们查看一下该表的创建语句,会发现在创建表的最后还可以对auto_increment进行赋值:
我们来试试看:
现在新建一个表,将auto_increment赋为2000,再进行数据插入:
我们可以看到该列的值从建表时赋的值开始自增长,所以我们可以建表时在最后对auto_increment进行赋值来改变初始增长值
在最后自增长要搭配主键来使用,不然系统会报错:
2.7 唯一键
一张表中有往往有很多列要求数据不能重复,但是一张表中只能有一个主键,唯一键就可以解决表中有多个列需要唯一性约束的问题。使用unique key来设置唯一键。
唯一键的本质和主键差不多,唯一键允许为空,而且可以多个为空,空字段不做唯一性比较。
唯一键和主键的区别: 我们可以简单理解成,主键更多的是标识唯一性的。而唯一键更多的是保证在业务上,不要和别的信息出现重复。
我们来举例说明:
我们创建了一个student表,有id/name/telephone三个列,其中telephone被设置了唯一键,数据不能重复
下面来插入数据:
我们可以看到在插入‘e’学生时因为telephone列的数据有重复,所以系统报错了,还能发现该列数据NULL可以有多个
2.8 外键
外键用于定义主表和从表之间的关系:外键约束主要定义在从表上,主表则必须是有主键约束或唯一键约束。当定义外键后,要求外键列数据必须在主表的主键列存在或为null。
定义外键语法:
CONSTRAINT 外键约束名 FOREIGN KEY (列名) REFERENCES 主表名 (列名)
注意这里CONSTRAINT 外键约束名 是给约束起名,我们可以忽略系统就会自动命名
下面我们拿具体情况来举例:
我们要求学生表里的每个学生的class_id的数据在上班级表中的id列都存在
现在我们开始建表:
下面开始插入数据:
向class表中添加班级:
向stu表中添加学生:
可以看到当我们向stu中插入一个class里id中不存在的数据时,系统报错了
在下面我们想要删除class表中id为1的班级,系统也报错了,因为stu表中还有学生的class_id为1,删除不符合逻辑:
当我们将stu表中class_id为1的学生数据全部删除时,这时class表中id为1的班级就可以删除了
本期博客到这里又要结束了~
更多MySQL技能请看:http://t.csdn.cn/W9dQl
博主努力更新中~