mysql基础——表的约束
我们之前在建表创建数据时,发现如果插入的数据超出本身的范围或者类型不符都会被拦截报错,这本质上就是表的一种约束,这种约束使得我们插入数据库表中的数据一定是符合预期的,约束本质就是通过技术手段,强制让我们插入正确的数据。本次我们就来讲解表中各个约束条件。
一、空属性
在mysql中,null表示什么都没有,他并不像c中的null为0或其他,也不能进行运算。
语法:在类型声明后加null/not null即可。(默认为null)
如果被not null约束了,代表我们插入数据时一定不能忽略此项。
可以看到,我们无论一起插入还是单独插入id都被许可,但如果只插入name值就会报错,因为不支持id为空。
二、默认值
我们看上图t10表的描述,发现Null列的后面还有一列——Default,该列就相当于我们C++中的缺省参数,我们不插入此项,到时候就会自动把default中的值插入。我们也可以手动改变default。
语法:name type default value;
可以发现,空属性和default也可以一起使用。我们插入时,如果不提供该项,其就会把该项的default作为参数。但是,如果是not null+default null。此时还不插入该项就会报错,因为不允许有空,且默认值也是空,代表必须有参数。
null +default 0 :传该项则代替0,不传0作为参数。
not null +default 0:传该项则代替0,不传0作为参数。
null +default null:传该项则代替null,不传null作为参数。
not +default null:插入时必须插入该项。
三、列描述
语法:在声明类型后加comment '描述'
但我们查看表的信息并没有发现列的注释,只能通过show语句
四、zerofill
还记得我们在数据类型时,有一个整型int没有提到的细节:int(m)中的m代表什么意义,我们定义变量时如果不加会发现m默认是10,这是什么东西?
如果没有zerofill,那么这个m将毫无意义,zerofill的意义是如果类型是int(m)且数据类型有zerofill,
插入的数是n位的int(n<m),那么显示的时候就会在数字前补(m-n)个0
可以看到,如果没有zerofill(password)输入什么毫无影响,但有zerofill的id就会有影响了,如果n>m,那么zerofill也会不起作用,但无论怎样,在存储数据时会把补齐的0都忽略;
五、主键(列中的Key)
主键:primary key用来唯一的约束该字段里面的数据,不能重复,不能为空,一张表中最多只能有一个主键;主键所在的列通常是整数类型。
主键是修饰某一属性的,修饰后就不允许插入相同的值。
结果也符合我们的预期,插入第二个相同的id就会失败。
当创建表时忘记加主键,我们也可以追加:
alter table 表名 add primary key(字段列表)
删除主键:
alter table 表名 drop primary key;
复合主键
如果在一个表中,我们不想只有一列拥有主键的属性,就可以用符合主键
注意:这仍符合我们的一个表只有一个主键,只是这两个合起来称为一个复合主键
复合主键的规则是:只有两列插入的数据完全相同才会报错。
六、自增长
auto_increment:当对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值 +1操作,得到一个新的不同的值。通常和主键搭配使用,作为逻辑主键。
自增长的特点:
任何一个字段要做自增长,前提是本身是一个索引(key一栏有值)
自增长字段必须是整数
一张表最多只能有一个自增长
我们可以看到,我们两次插入都没有给id赋值,但是显示的是id分别是1和2,这就是自增长,没有赋值时,就会默认赋值为自增长最大值+1(默认从1开始),此时如果我们再插入一个100的id,那么下一次自增长值就是101插入。
七、唯一键
一张表中有往往有很多字段需要唯一性,数据不能重复,但是一张表中只能有一个主键:唯一键就可以解决表中有多个字段需要唯一性约束的问题。
唯一键的本质和主键差不多,唯一键允许为空,而且可以多个为空,空字段不做唯一性比较。
关于唯一键和主键的区别: 我们可以简单理解成,主键更多的是标识唯一性的。而唯一键更多的是保证在业务上,不要和别的信息出现重复。一般我们对长期不动的数据进行主键标识,比如身份证号等。
语法:
name type unique
八、外键
这是我们第一次接触到两个表之间的约束
外键用于定义主表和从表之间的关系:外键约束主要定义在从表上,主表则必须是有主键约束或unique 约束。当定义外键后,要求外键列数据必须在主表的主键列存在或为null
语法:
foreign key (字段名) references 主表(列)
我们引入一个案例便于理解
如果将班级表中的数据都设计在每个学生表后面就会出现数据冗余,我们只需要让stu的class-id和myclass_id有关联即可——即外键约束。
先创建两个表
现在100号张三在10班C++班,101号张三在20班Java班。
现在我们尝试插入一个30班的学生
插入失败,因为没有这个班级。但我们插入null也可以(学生还未分配班级)
总结就是:在外键约束中,从表的限制列中不允许插入主表主表限制列之外的值(null除外)。