目录
1、空属性
2、默认值
3、列描述
4、zerofill
5、主键
6、自增长
7、唯一键
8、外键
我们上篇博客讲了数据类型,数据类型其中的约束很单一,我们还要额外的今天我们要讲述这几个约束:null/not null,default, comment, zerofill,primary key,auto_increment,unique key 。
NULL,“”,0我们首先要理解下这三个的区别。
NULL就是空,没有任何数据。
“”有数据,但是为空串。
0为数字0。
案例:
我们应该都见过班级表,第一,班级名称不能为空,要不不知道学生所在班级是什么;第二,班级所在地不能为空 ,不然学生去哪里上课。所以我们在建立班级表时,要注意设置约束。
在创建时class没有明确的约束不能为空,则在插入数据时可以为空。
不允许设为NULL,设置NULL则会报错。
但是‘’则可以插入,只是为空串,但不为NULL。
这种约束一旦建立就会倒逼程序员不能插入NULL。
默认值:某一种数据会经常性的出现某个具体的值,可以在一开始就指定好,在需要真实数据的时候, 用户可以选择性的使用默认值。
案例:
这时我们插入数据,age与gender列不插入数据就会显示默认数据。
默认值的生效:数据在插入的时候不给该字段赋值,就使用默认值。
到这里,我有个疑问,我对一个列属性既设置not null 有设置default,在插入时我不插入数据,MYSQL会不会允许我这样的操作呢?
从图上可知,当有默认值时尽管约束为not null,不插入数据,也会有默认值防止该值为null。
default vs NULL:
default:在我们不显示的向指定列中插入,default自动会起效果。
NULL:当我们显示的向一列插入,如果插入的是正常值,就正常工作,否则,插入NULL,NOT NULL就约束你不让你插入。
列描述:comment,没有实际含义,专门用来描述字段,会根据表创建语句保存,用来给程序员或DBA 来进行了解。
这里讲的是约束为什么会提到注释,其实这里的注释是用来约束程序员本身的,让程序员在插入数据前可以起到参考作用。
zerofill我们通过实验得出结论。
我们会发现int后跟了个括号其中写了11,这里的int是4字节大小,为什么要跟11,其实有了zerofill的帮助,11才有意义。
首先,先插入个数据,再改变列属性。
我们会发现值1,前多了10个零。
刚刚int默认是int(11),现在我们改成int(6),发现值1,前多了5个零。
这就是zerofill属性的作用,如果宽度小于设定的宽度(这里设置的是6),自动填充0。
但是这只是显示的效果,其实mysql在存储时还是存储1。
这里揭晓上文的答案,int后跟11,是表示显示的位数,带上zerofill就会显示相应的位数。
这究竟有什么用呢?加不加上都无所谓。比如,当该表格中会插入很多数据,但是数字的之间的差距很大,想让表格更好看一点,更加整齐,可以选择zerofill。
主键:primary key用来唯一的约束该字段里面的数据,不能重复,不能为空,一张表中最多只能有一个。主键所在的列通常是整数类型。
案例:
插入数据:
不能重复,不能为空。
一张表只能有一个主键:
主键可以在建表之后追加:
删除主键:
复合主键:
将多个字段 作为主键,可以使用复合主键。
插入数据:
不允许混合主键同时相同,允许部分不同。
auto_increment:当对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值 +1操作,得到一个新的不同的值。通常和主键搭配使用,作为逻辑主键。
自增长的特点: 任何一个字段要做自增长,前提是本身是一个索引(key一栏有值) 自增长字段必须是整数 一张表最多只能有一个自增长。
案例:
所以说,自增长必须和主键相配合。也就是说自增长的字段一定是主键。
既然是自增长,我们可以不插入数据。
至于mysql怎么知道下一次增加到什么数字呢?
mysql会存在一个字段记录数据。
当然我们也可以自己插入数据。
当然我们也可以指定自增长的起点。
一张表中有往往有很多字段需要唯一性,数据不能重复,但是一张表中只能有一个主键:唯一键就可以 解决表中有多个字段需要唯一性约束的问题。 唯一键的本质和主键差不多,唯一键允许为空,而且可以多个为空,空字段不做唯一性比较。
案例:
唯一键不允许数据重复。
外键用于定义主表和从表之间的关系,维护主表和从表的关系。外键约束主要定义在从表上,主表则必须是有主键约束或unique 约束。当定义外键后,要求外键列数据必须在主表的主键列存在或为null。
如果将班级表中的数据都设计在每个学生表的后面,那就会出现数据冗余,所以我们只要设计成让stu->class_id和myclass->id形成关联的关系=>外键约束.
对上面的示意图进行设计:
先创建主键表和从表:
我们可以看见约束的体现。
主表myclass中没有213班级,从表这时要插入213班级的同学,MySQL就会阻止插入。
建立外键的本质其实就是把相关性交给mysql去审核了,提前告诉mysql 表之间的约束关系,那么当用户插入不符合业务逻辑的数据的时候,mysql不允许你插入。