【MySQL】表的约束
前言
hi~大家好呀,欢迎来到我的MySQL学习笔记系列~
继上次数据类型的描述,这篇笔记重点记录DDL-数据定义语言对表的结构中的其他约束条件进行说明,以便让关系型数据库真正的保持完整性。
我的上一篇MySQL笔记~
【MySQL】表的操作和数据类型_柒海啦的博客-CSDN博客
目录
1.空属性
2.默认值
3.列描述
4.补零
5.主键
6.自增长
7.唯一键
8.外键
1.空属性
每个数据类型没有加约束的话,默认为空属性。即可以不插入NULL。
空属性为NULL,不可为空属性为NOT NULL。
需要注意的是,实际开发中,数据为空时无法参与计算的,所以经可能的保证字段不为空。
创建两表后,可以查看其null属性:
插入的话就可以发现t1表可以插入NULL值,t2表不可插入NULL值哦~
2.默认值
如果不输入数据,会自动填入默认数据的属性。
default 默认值;
需要注意,默认值的生效需要在插入的时候不显示对其插入即可。(即在values前的属性指定中不显示表示其属性)
在对t4表插入实例的时候,想要默认值id生效,不对其显示插入即可:
另外,针对于not null和default这两个约束条件,是可以并存的。如果不是显示插入的话,默认值就会进行生效。如果显示插入,那么not null的存在是无法插入NULL值的。
3.列描述
comment '描述字段';
没有特殊的含义,可以通过show create table 表名;进行查看,用于程序员做属性结构时候的批注。
4.补零
int(n) zerofill......;
首先,适用于整数类型。对于整数类型后面的()来说(比如tinyint(n)、int(n)、bigint(n)),只有加上zerofill才会生效,表示在指定宽度内,如果没有填充完会使用0进行填充。由于全用0填充话,是无法使用负数的,所以使用zerofill会自动设置为unsigned无符号类型的。
如果输入超出长度的话则不会填充额外的0.
5.主键
primary key;
primary key(...);
当我们想要一个表中能够区别元组(记录)的一个属性或者属性组中的其中一个,就可以成为主键。其中符合主键只能使用第二行进行定义,对于符合主键来说,其中的任何一个都不能作为主键(也就是说任何一个非真子集均不可唯一区分记录,只有属性组合在一起才能表示记录的完整性)
主键通常会自己带上的限制:记录唯一性+非NULL。
需要注意,一个表最多一个主键,否则没有。
我们为什么需要主键?
1.查找的时候确定唯一性。
2.插入的时候不能出现重复的数据。
3.改的时候确定一个唯一的记录。
4.删的时候确定一个唯一的记录。
也就是说我们需要找到一个唯一的指定记录即可。
另外,对于DDL语言中,我们可以使用alter进行删除主键和添加主键。
-删除主键:
alter table 表名 drop primary key; -- 直接丢弃即可
-添加主键:
alter table 表名 add primary key(属性组);
对于添加主键需要特别注意。因为添加主键的话,可能是由于前面表的结构没有定义完整,可能中间插入了很多数据。如果对于此主键属性来说,里面的数据不满足主键的条件的话就很容易出错,这样就会很麻烦。
6.自增长
auto_increment;
自增长又被称为逻辑主键,通常配合主键一起使用。
加上此约束条件的属性,如果不主动赋值,会从1开始,向后逐渐增加(给此列添加值)。如果更新值,之后会以此属性的最大值进行更新。实际上,此特性取决于在create的时候,会在表结构的外面增加变量auto_increment=? 当插入一个值后会跟新为下一个值默认的值。
注意:
1.如果没有主键,必须此列是主键。primary key
2.此时在扩展就会发现自动增长 auto_increment;
3.插入的时候,此列就完全可以不用管了。不用显示指明插入。
4.插入后,使用show create table test; 查看,会发现后面属性会加上) auto_increment=n;// 此时自动会维护一个计数器。
5..如果主动插入自然是可以进去的。可以显示指明数据(不冲突即可)。
6..如果显示插入后,后续不指定的话,会从之前显示指定插入的最大值id + 1.因为显示插入的时候,计数器会进行维护的。
7.自然可以自己设置默认计数器,在creat()auto_increment=num;进行设计即可。8.注意整张表只能存在一个auto列,并且必须被定义为唯一属性(设计为主键的话就是primary,否则就是unique唯一约束属性,后面会讲)
9.auto_increment必须设置为非负整数。
创建只有一列的primary key自增长属性。
可以自己在create的时候设置auto_increment:
后续第一次默认插入果然自动赋值为100了,后续就会从100或者插入的最大值开始相加。
7.唯一键
unique;
唯一键很简单,就是在对于此属性约束条件中的数据来说,每一个都是独一无二的。这点和primary key类似,唯一不同的就是它可以为空。
现实中,一个记录的很多属性具有很多唯一性的值。但是此时并没有设置为主键。而主键只是在众多具有唯一性的属性列中被选择成为主键而已,而其他字段的唯一性,也要保证其的唯一性。由于主键只能由一个,mysql提供了一种保证数据唯一性的方案。
主键为了保证在查找的时候,找到唯一的一条记录。
唯一键:更多是保证在表中,各个不同的值,一定在mysql层面也要保证其的唯一性。当然,如果也设置约束not null,此时约束方面就和主键一样了primary key;
8.外键
foreign key () references 主表(列)
对于关系型数据库,自然需要建立表和表之间的参照关系。
比如,在学校中成绩表就要和学生表进行对应起来。成绩表中出现的学生名字必须参照于学生表中出现过的学生名字,不可错误或者没有。所以,此时对于这两张表来说,成绩表中的学生属性就是一个从表中的属性,学生表中的学生是主表中的唯一限制的属性。
对于主表来说,此属性必须是primary key或者unique约束条件。(参照必须准确可靠)
那么此时,外键所组成的关系就是有关系 + 有约束 = 外键约束。能够保证表和表数据完整性和一致性。对于外键来说,也是可以null,这一点也和主键不一样。