表的约束
约束就是设定条条框框,保证被约束目标符合约束条件。表的约束就是对表内列数据的约束,保证列数据的正确性。
default
设置列数据的默认值。当用户添加记录的时候没有初始化该列的数据,就是使用默认值初始化。
如果创建表的时候没有设置默认值,会自动将默认值设置为null。
空值
往往数据库中的数据不能为空,空值不能进行数据运算。我们可以在列数据设置空属性来控制数据是否可以为空。
默认空属性为null表示数据可以为空,设置为not null即可让数据不为空。
如果插入数据,name列的数据初始值为null,会报错:name值不可以为空;如果不对name进行赋值,会报错:name没有default值。这两个报错的原因是不同的,前者是因为将值设置为null,后者是因为设置空属性not null就不会自动设置默认值,不赋值就会报错。空值和默认值也可以同时设置,但是这样的场景不多。
comment
列描述,没有实际的含义,就是为了开发人员更方便了解列的内容。
通过desc不能看到注释,只能通过show查看:
zerofill
不知道你有没有注意过数值类型的后面会有一个数,这个数看起来没什么用,其实是因为我们没有使用zerofill这个约束。
数值类型后面的数字表示数据的宽度,如果使用了zerofill当数据的长度小于宽度时,就会用0填充使其宽度符合这个值。举个例子:
设置zerofill约束后,数值类型都是无符号的。
zerofill只是在显示的时候填充0,并没有修改数据,使用原数据查找时还是可以找到的:
主键 primary key
主键可以作为表中所有记录的唯一性标识,每个表都只能有一个主键,主键约束的列的内容每个记录都不能相同不能为空,通常数值类型会作为表的主键。就像生活中的身份证号一样,任何人的身份证号都不相同,是我们社会中身份的唯一标识。
这两种约束方式都可以:
插入主键值相同的记录时就会发生错误:
虽然主键在一个表中只有一个,但是可以将多行同时设为主键,这就是复合主键。就好比我们进高铁站验身份的时候,为了保证本人操作,需要我们刷身份证同时刷脸,这个时候身份证+面部信息就是一个复合主键。
删除之前的主键,其实主键也可以看作表中的一个列:
用id和name添加一个复合主键:
在插入记录时,只有复合主键中的所有值都与已插入的数据相同时,才会报错。复合主键其实就是将每个值都拼接起来整体对比。记录(2, Mike)被认作2-Mike,所以插入(2, Sam)不会报错。
自增长 auto_increment
当对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值 +1操作,得到一个新的不同的值。通常和主键搭配使用,作为逻辑主键。
通俗来讲,就是有一个key值,你可以不用设置它,每次添加新的记录时,这个值都是上一个值+1,下面看一个例子:
我们插入几个记录,但是不指定id的值,第一个id的值就是1:
后续的id值都会在最高的值基础上+1:
如果我们添加一个id为200的记录,后续添加都是在200的基础上+1:
表中有一个auto_increment记录下一个key的值,前面的记录插入到id为203了,那么下一次就是204:
我们也可以在创建表的时候就指定这个自增值的大小,不指定就从1开始:
唯一键 unique
一张表可能不止主键的列的数据是有唯一性的。例如,一个公司的员工,工号是标识员工唯一性的数据,但是员工联系方式也是唯一的,不可能有两个人的手机号是相同的。注意,联系方式也可以作为唯一性标识,但是工号便于管理,没有用联系方式罢了。
唯一键和主键本质差不多,区别就在于唯一键的数据可以为空且不参与数据的比较。主键是用来标识唯一性的,唯一键更多是保证业务上保证数据不重复
唯一键的值为null的时候不作计算,多个记录的值为null不会报错。但是非空的唯一键值相同就会报错。
外键 foreign key
外键用于定义主表和从表之间的关系:外键约束主要定义在从表上,主表则必须是有主键约束或unique 约束。当定义外键后,要求外键列数据必须在主表的主键列存在或为null。
语法:
foreign key (从表列名) references 主表 (列名)
例子:在学生管理系统中,每个学生都有所属的班级,必然会存在两张表,学生表和班级表。学生表中记录学生信息以及学生所在班级,班级表记录班级号以及班级名称等等。
学生表的班级号和班级表的班级号是一一对应的,学生不可能在一个不存在的班级中,那么每次插入学生数据时就需要看一下学生的班级在不在班级表中。这种情况下我们就可以使用外键,将两个表上的列数据关联,班级表是主表,学生表是从表。
创建表,并在班级表插入数据,班级表的外键值必须是主键或者唯一键:
向从表插入学生数据,班级id不在班级表中就会插入失败: