1. 前言
数据库的约束是关系型数据库的一个重要的功能,因此约束可以规定表中的数据规则,从而确保数据的正确性.
2. 非空约束(NOT NULL)
非空约束(NOT NULL): 指示某列不能存储 NULL 值.
如果可以为null,就可以理解选填项,不允许为null,就是必填项.
如果不加约束,创建一张表.它的值是可以为null的.
例如:
使用desc查看student这张表,可以看到有一列是null,它的值是YES,这就代表它的值可以为null.
可以新增值为null的数据.
如果id必须填,但是名字可以不填,就需要在创建数据库表时使用非空约束
使用not null 之后,我们可以看到这里id的null列的值为NO,代表了此处的值不允许为null
此时如果再去新增一个id值为null的数据的话,就会报错.但是
3. 唯一约束(UNIQUE)
唯一约束(UNIQUE): 保证某列的每行必须有唯一的值
例如学生表中的学生id不能重复,就可以使用UNIQUE来进行约束
使用desc查看表的结构,可以看到Key这一列,id有一个UNI,就是UNIQUE的前三个字母.
此时如果新增两个id一样的数据就会报错,使用唯一约束新增数据时,会先去查询数据,没有重复的数据才会进行新增
4. 主键约束(PRIMARY KEY)
主键约束PRIMARY KEY: NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。
约束是可以组合使用的,如果一个学生的id即不能为null,也不能重复,就可以使用非空约束加上唯一约束
但是使用desc 查看表结构时,我们可以看到这里的Key并不是UNI,而是PRI(PRIMARY KEY).
主键约束其实就是非空约束和唯一约束的结合
使用非空约束加上唯一约束其实和直接设置主键约束是一样的
使用主键约束和唯一约束时,都会先去查询数据,因此MySQL会自动去给主键约束和唯一约束添加索引,从而提高查询的效率
在MySQL中,主键只能有一个!
虽然MySQL中只能有一个主键,但是MySQL允许把多个列合并在一起,使用同一个主键,这种成为联合主键
主键还有一个常用的用法,使用MySQL自带的"自增主键"作为主键的值,需要在primary key
的后面添加auto_increment
此时使用desc 查看表结构时,可以看到id在Extra处的值时auto_increment
使用自增主键之后,在插入id的时候,可以指定id,也可以不指定(null),不指定时MySQL就会自动生成
此处的id 就是由MySQL自动生成的
再次插入一条数据时,第二个id是2. 因此MySQL会在上一条数据的id基础上+1.
刚才说了使用自增主键时可以指定,也可以不指定,下面就是指定的效果
那么此时要在新增一条数据,但是不指定id,新增的id是什么呢?
实践出真知
可以看到新增的这条数据的id是11.
MySQL的自增主键,会根据最大值进行新增.
5. 默认值约束(DEFAULT)
默认值约束(DEFAULT): 规定没有给列赋值时的默认值
新增数据时,可以指定列新增数据,那么没有被赋值的数据,就会以默认值的进行填充
上面是我创建的一个"student"表,设置name的默认值为"未命名".
接下来新增两条数据
第一次新增的数据是一条完整的数据,但是第二条数据,只对id进行了赋值
通过查询我们可以看到第二条的数据的name变成了 未命名,给未赋值的列指定默认值.这就是默认值约束的用法
6. 外键约束(FOREIGN KEY)
外键约束(FOREIGN KEY): 保证一个表中的数据匹配另一个表中的值的参照完整性
外键约束是两个表之间相互约束,可以将两张表关联起来.
举个例子: 我要创建两张表,一个是学生信息表,学生信息表中有 学号,学生姓名和学生班级编号 这三个信息.另外一个是班级信息表,班级信息表中有 班级编号,班级的名字这两个信息.
而此时要将学生信息表中的班级编号和班级信息表中的班级编号连接起来,就可以使用外键约束.
创建班级信息表:
创建学生信息表,同时将 学生信息表中的classId 与 班级信息表中的 id建立连接.
注意: 设置外键时,外键所参照的键必须为被参照表的主键(primary key)或者是唯一(unique).
建立约束之后,班级信息表中的 班级编号就对学生信息表中的数据产生了约束. 学生的班级编号必须在班级信息表的班级编号中.因此外键约束下,插入数据也会有查询操作.
约束表(此处是班级信息表) 也被称为 “父表”
被约束表(此处是学生信息表) 也被称为 “子表”
虽然父表会对子表产生约束,但是子表也会对父表产生影响.
如果直接删除父表,就会报错.
例如:
此处并没有删除成功,如果要删除,要先删除子表.
删除或者修改父表中的数据,也要看这条数据是否被子表所引用.
补充: 有时需要把父表删除,但是直接删又删不掉,所以这里可以采用"逻辑删除",可以设置一个变量,让它的取值为0/1,0就是无效数据(逻辑上删除),1是有效数据.只需要改变这个变量的值即可
7.检查约束(CHECK)
检查约束(CHECK) : 保证列中的值符合指定的条件,对于MySQL数据库,对CHECK进行分析,但是忽略CHECK的子句
举个例子: 性别这里一般都是男和女这两个选项,就可以使用检查约束对性别进行约束.在新增数据时,就会对当前新增的数据进行判断,看当前数据是否满足条件.
不过检查约束在MySQL5中并不支持,写了不会报错,但也不会执行.所以不做过多介绍了.
8. 总结
约束在数据库中还是很重要的,再说一下主键常用的方法在主键可以使用MySQL自带的"自增主键"作为主键的值,需要在primary key的后面添加auto_increment,外键要搞清楚那个是父表,那个是子表.设置外键时,外键所参照的键必须为被参照表的主键(primary key)或者是唯一(unique).