在desc table,一张表里面,后面的NULL,Key,Default,Extra列,本篇会讲到。
在之前说过数据类型也是一种约束,因为数据类型很少,所以要需要更多的约束来保证数据的合法性和正确性,表中的各种约束,来使得数据库里面的数据是合法的,约束会倒逼程序员插入正确的数据。
约束的目的就是保证数据的完整性和可预期性。
空属性
两个值:null(默认的)和not null(不为空)
在MYSQL里面Null表示的是没有,区别’ ',空串,比方说你在银行取钱,你如果没有账户,就可以类比为Null,如果你有账户,但是账户里面没有钱,就代表空串
select null还是null
同时null还不参与运算:
在插入数据时,一列中可以时null,也可以时not null,就是这一列可以为空,不可以为空
例子:
创建一个班级表,包含班级名和班级所在的教室。
站在正常的业务逻辑中:
如果班级没有名字,你不知道你在哪个班级
如果教室名字可以为空,就不知道在哪上课
创建表:
表示这两列都不为空。
全列都插入:
一列插入为null
这里说没有匹配的值,也就是没有默认值
讲完默认值就清楚上面的报错了。
默认值
默认值:某一种数据会经常性的出现某个具体的值,可以在一开始就指定好,在需要真实数据的时候,用户可以选择性的使用默认值。
建立一张表:
在建表的时候,给了age和gender默认值,这里的默认值就类比缺省值,如果给了,就使用给了的,如果没给,就用缺省值,这里的name 设置为not null,
插入数据:
插入数据:
我们只给了name一列的值,没有插入其他列的,就被设置为了默认值。
not null和null和默认值的区别?
当一个类型变量没有设置默认值的时候,default默认值为null,如果他的空属性为not null,则就对应name
由于设置的是not null,你给null的话,就不能给null,就报错了
如果你不给的话
他就会走默认值,但是没设置默认值,他就会报错
如果他的空属性可以为null,举例子年龄列为空
如果不给年龄列,就会走默认值
总结:
comment列描述
列描述不算约束,数据库不会看这个,只是给程序员看的,就像C/C++中的注释
例子:
这里看不到注释,只有show create table\G可以看到列描述
而列描述不会影响插入。
zerofill
这个是显示方面的约束。
创建一张表:
插入数据:
修改位数0填充:
在插入数据时,2只有一位,共十位,其他位由0填充0000000002,
再插入数据:
显示的不是222,而是0000000222,zerofill给指定一列添加zerofill属性,如果插入数据位数小于10位,则其他位用0填充,假如说插入一个808,则还有七位填0,zerofill不会对数据造成影响,该是啥就是啥,只是显示的时候会填0:
搜的时候也是按2搜的。
修改一下约束有zerofill的列数据类型的填充位数:
为了显著观察,继续修改约束有zerofill的列数据类型的填充位数:
再插入点数据:
我们发现位数大于等于4的都不会用0填充,只有小于4位的会用0填充。
为什么默认情况下是10位,int有4个字节,也就是32位,有符号能表示的最大范围为-2^31 ~ (2^31 -1),就是正负20多亿,无符号能表示0~(2^32-1),最大位为40多亿,则十进制用十位就可以表示无符号int所有数,有符号位,多给一个符号位就是11位
主键
主键:primary key用来唯一的约束该字段里面的数据,不能重复,不能为空,一张表中最多只能有一个主键;主键所在的列通常是整数类型。
添加主键:
这里的id的key列为PRI,就代表这一列是主键列。创建表的时候并没有设置not null,但是自动有not null的约束。
插入数据:
这里id又给了一个1,报错为主键错误,所以必须是不同的才行
所以这种约束会倒逼程序员插入唯一的数据。
这样一来按照id查找就唯一确定了
更新的时候也是:
所以我们可以通过主键确定的唯一性来进行增删查改。
增删主键
删除主键:
此时没有主键就可以插入重复的数据:
添加主键:
这里id有2个2,所以不能给id添加主键,要想添加主键,就要删除一个,
添加主键:
复合主键
在创建表的时候,在所有字段之后,使用primary key(主键字段列表)来创建主键,如果有多个字段
作为主键,可以使用复合主键
例子:一个选课系统,一个学生可以选多门课,一门课也可以让多个人选择,但是一个学生不能重复选一门课,这样就可以把学生和课程都设置为主键:
可以看到id和course_id列的key都是PRI,这两个都是主键,只要id和course_id合起来不重复就行。
插入数据:
再来一个id相同但course_id不同的,表示一个同学选择多个课程
再插入一个id不同,course_id相同的,表示一门课程可以被多个学生选择:
id和course_id都相同:
这里主键冲突,是将1234-40当作整体看,出现主键冲突。
所以复合主键只有多个主键同时重复的时候才会出现主键冲突,所以主键合起来才是一个主键。