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