一:空约束
1.1:not null
创建一个案例表:
课程名为空:会不知道上什么课
教室名为空:会不知道在哪里上课
如果只插入课程名,会提示教室名没有默认的值。
这是因为:一列如果约束为not null,插入的时候首先检查是否有default value,如果有,就设置为其,如果帘default value都没有,那就会报错,提示不能为空。
1.2:null
插入的时候允许值为空,这样的话插入的时候即使不指定该列,该列也会为空:
这里我们创建了一个三列的表。name class id
但是!全列插入省略全部列名的时候,是会报错的:
1.3:default value
默认值:某一个数据会经常的出现某一个具体的值,可以事先设定好这个值,在用户可以选择默认值使用。
注意和null和not null一样,就算有默认值,就算可以为空,也不能直接使用全列插入(省略所有列名),依然需要指定列名才能正确插入。
接下来理解一下not null和default的关系:
插入是成功的,sex列是不允许为空的,但是有默认值,所以null会先检查有无default,有就使用,没有就报错。
注意:带有default 和null的列,才可以在插入的时候省略单独的该列名进行插入。但是不能进行全部省略列名的插入。
二:列描述
类似于注释,但是desc看不到注释,可以通过show查看
注:\G
是一个命令行实用程序,用于显示查询结果的垂直格式。它主要用于 mysqldump
工具中,以在输出中创建更整洁的表格。
三:zerofill
一开始学习的时候,int(10)这里我理解为只能插入8位数字,其实是大错特错,整形是4字节码,这个8又代表什么呢?
当我们没有添加zerofill的时候,表是这样的。
增加zerofill约束后,建表语句也有所变化。
此时a就变成了一个10位的int类型。
这次可以看到a的值由原来的1变成00001,这就是zerofill属性的作用,如果宽度小于设定的宽度(这里设置的是
5),自动填充0。要注意的是,这只是最后显示的结果,在MySQL中实际存储的还是2。为什么是这样呢?我们可以用hex函数来证明。
四:主键
主键:primary key用来唯一的约束该字段里面的数据,不能重复,不能为空,也就是不能省略该列名直接插入(但是如果给了默认值或者自增长约束可以省略主键列名插入),一张表中最多只能有一个主键;主键
所在的列通常是整数类型。
4.1:创建方式
4.1.1:建表时创建的2种
4.1.2:建表后修改约束为主键
alter table tablename modify 列名 约束;, 可以直接修改列的约束
alter table tablename add primary key(列名); ,可以为该列添加主键
对应的删除主键:
alter table drop primary key;
4.2:复合主键
复合主键语法不是这样的。
正确语法:在创建表末尾添加primary key(需要的主键字段列表)如:
首先主键的插入不能为空,
主键不能插入重复值,但是一个学生会选多个课程,这里我们采用复合主键后,约束就变成了只要2个不同时都重复就可以正确插入。
现在是报错了。
五:自增长
注意:auto_increment 不能与default一起使用。
去除default后我们连续插入3个值
本来主键插入不能为空,也就是不能省略该列名插入,但是如果和自增长一起用,就可以省略。
自增长的特点:
- 自增长的字段必须在key列有值,比如主键,唯一键,外键,复合主键等。通过desc 表名查看
- 自增长字段数据类型必须是整数
- 一张表只能存在一个自增长字段
如果我们先删除上面数据再插入几条,id会从多少开始呢,还是1吗?
删除语法:delete from 表名 condition
可以看到自增长一定是会保存上一次插入的最后一个数,然后下一次插入从这个数+1开始。
通过show last_insert_id();可以查看
六:唯一键
一张表只能有一个主键,但是往往一张表需要多个唯一性,比如:
唯一键和主键的区别:
- 唯一键允许为空,而且可以多个为空,空字段不做唯一性比较。
关于主键和唯一键的区别:
主键是标识唯一性用的,唯一键更多的是保证业务上,不要和别的信息发生冲突。例如:
我们在公司需要设计一张员工表,员工表中有2个字段,一个是身份证号,一个是员工id。
肯定是需要通过身份证号来标识员工的唯一性的,所以我们设置身份证号为主键。
员工id肯定也是不能冲突的,所以设置员工id为唯一键,具体指的是员工在进行相关业务处理的时候,要保证业务的唯一性。
一般而言:我们会将与当前业务不想关的又需要唯一性的字段设置为主键,这样在进行相关业务调整的时候,不用太多的调整。
如图,唯一键可以为空插入。
七:外键
有2张这样的表,学生的班级号一定存在于班级表中的班级号,不可能出现班级表中班级号以外的值。
因此在对学生表进行增删查改的时候,班级号肯定是与班级表中的班级号是对应的。因此我们引入外键。
语法:
- 外键定义在从表上
- 创建外键的列数据必须在主表存在或者其本身为NULL
- 指定数据表的存储引擎是innodb
- 引用键(主表的)必须为索引(目前我们只知道唯一键和主键)
创建这样2张表,主表为class,从表位student。
当插入班级号为3的学生时报错,这是因为从表违反了规定:外键数据必须在主表列中存在。
我们也说过:外键数据必须在主表列中存在或者为null,因此插入null也是正确的。