表中一定要有各种约束,通过约束来保证未来插入表格的数据是符合预期的。约束本质是通过技术手段倒闭程序员插入正确的数据。反过来,站在mysql视角,插入进来的数据,都是符合数据约束的。
约束的最终目标:保证数据的完整性和可预期性。
目录
一、空属值
二、默认值
三、列描述
四、zerofill
五、 主键
复合主键
六、自增长
七、唯一键
八、 外键
一、空属值
mysql中NULL表示没有,NULL不参与计算,单引号和双引号都表示空字符串(一般用单引号)
两个值:null(默认的)和 not null(不能为空)
数据库默认字段基本都是字段为空,但实际开发时,尽可能保证字段不为空,因为数据为空无法参与运算。
可以发现,插入数据时,设置了not null属性的列是不允许为空的。
二、默认值
默认值:某种数据会经常性的出现某个具体的值,可以在一开始就指定好,在需要真实数据的时候,用户可以选择性地使用默认值。
如果既指定not null 又指定default会怎样?
通过测试我们可以发现:只要设置了not null,我们就无法插入null,如果没有明确指定一列要插入,用的是default,如果建表时没有设置default值,就无法直接插入,设置了default值,就用的是default值。
default和not null不冲突,他们是互相补充的。
为什么我们平时建表时没有设置default值,却还是可以缺省插入呢?
原因是mysql会默认自动给我们加上default NULL
如果建表时带了not null,mysql就默认不设置default
三、列描述
comment,没有实际含义,专门用来描述字段(类似语言中的注释)
四、zerofill
数字类型后圆括号里带上数字int (10)是什么意思?
可以看到,我们建表的时候没有带(10),但mysqld给我们优化了一下。
此时,我们尝试给b这列加上zerofill:
此时:表中的数据就变成了这样:
zerofill的作用就是当数据的宽度小于指定宽度(圆括号内的数字)时,自动补0。
默认有符号的11位宽度,无符号的10位宽度就足够了:
五、 主键
primary key用来唯一地约束该字段里面的数据,不能重复,不能为空,一张表最多一个主键,主键所在列通常是整数类型。(直白讲就是要有一列数据能标识这一行数据的唯一性,比如一个学生的学号)主键会默认加上非空约束。
主键冲突:
站在数据库的角度,根据主键一定可以唯一地找到一条对应的数据:
可以根据主键对数据进行准确的增删查改:
去掉主键:
另一种指定主键的方式:建表后再指定主键必须保证这一列是不冲突的,所以最后建表的时候就指定好主键:
复合主键
一个主键不一定只能定义一列,可以多列构成一个复合主键。
六、自增长
auto_increment:一般和主键搭配使用,可以无需指定自动增长,必须为整数,一张表最多一个自增长。
也可以指定id为1000插入:
插入1000后,意味着将下一次插入的起始数字改成了1001,后面插入的元素就会从1001开始自增。
应用场景:比如注册QQ时,QQ号就是自增的。
七、唯一键
unique key:不能重复,但可以为空
unique强调唯一性,主键只是选择一列唯一键作为主键。
通过上面测试可以发现,插入时id字段不能插入重复元素,但可以插入多个null值。
八、 外键
主表:班级表 从表:学生表
因为每个学生的班级id必须是在班级表里存在的,也就是说逻辑上不应该插入班级表里不存在的班级id,要起到约束的作用,可以使用外键约束。
foreign key(字段名)references (主表名)(列名)
此时,如果想插入一个不存在的班级是不行的:
如果想删除一个班级,在这个班级跟别的表还有关联时,也是删除不了的。
constraint 是给外键起名字,不起也有默认的: