约束是MySQL通过限制用户操作的方式,来达到维护数据本身的安全和完整的一套方案。
这里主要学习下面几种约束条件
null/not null,default, comment, zerofill,primary key, auto_increment,unique key
数据库默认字段为空。这个默认值可以在建表的时候修改
eg:创建学生表
表的信息为学生姓名以及班级,这两个属性在插入的时候不能为空。
创建表时在对应的字段添加default默认值即可。
注意创建表时可以选择不允许默认值,但是修改默认值。在MySQL这个数据库此时not null这个设置选项无意义。尽量不要这样设置。
列描述:comment,没有实际含义,专门用来描述字段,会根据表创建语句保存。类似于批注功能。告诉使用人这一列的特点。
primary key用来唯一的约束该字段里面的数据,不能重复,不能为空,一张表中最多只能有一个主键;主键所在的列通常是整数类型。
eg:学生表
学生学号只能有一个,学号设置为主键,当学号重复时发生主键冲突。同时学号这一项不能为空
不推荐给主键设置默认值,语法是可以的。主键因为不能重复,默认值只能使用一次毫无意义
删除表的主键:
alter table table_name drop primary key;
向表中添加主键:
alter table table_name add primary key(添加主键的列名);
当将一个列添加为主键时,这一列自动变为不允许默认值。
创建表时,可以选择使用多个列来构成一个主键,这种主键称为复合主键。
当构成在主键的所有列冲突时,此时才会发生主键冲突。
auto_increment:当对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值+1操作,得到一个新的不同的值。只有主键才可以被设置成自增长,作为逻辑主键。
一般自增长类型为整形,且一个表只有一个自增长类型。
综上:
在设置主键的之后,一般是将与业务逻辑无关的列作为主键,比如自增长序列。
一张表中有往往有很多字段需要唯一性,数据不能重复,但是一张表中只能有一个主键:唯一键就可以解决表中有多个字段需要唯一性约束的问题。
注意:
唯一键的本质和主键差不多,唯一键允许为空,而且可以多个为空,空字段不做唯一性比较。
主键和唯一键的区分:
实际业务不可能只有一张表,外键存在的意义是建立表与表之间的关系的
外键用于定义主表和从表之间的关系:外键约束主要定义在从表上,主表则必须是有主键约束或unique约束。
当定义外键后,要求外键列数据必须在主表的主键列存在或为null。
注意:
外键必须在从表上定义,且对应主表上必须是有主键约束或unique约束。
添加外键语法:
foreign key (字段名) references 主表(列)
eg:创建如上图所示的表结构。
首先创建主表 选课表:
这时语义上面已经存在了外键,但是数据库还无法检测。
eg:
如果此时向从表(学生信息表)中插入一个学生的信息,但这个学生信息的选课号不在选课表里面,从业务逻辑上讲,这次插入应该是失败的,但是因为我们还没有在从表上设置外键,所以在数据库语法上,这次插入会成功。
现在假设这个学校只有两节课,课程信息如下。
则插入选课号为600的学生应该不成功,因为学校没有编号为600这个课。但是此时插入会成功。
这时候就需要向从表添加外键约束,告诉MySQL这两张表存在约束。