1.概念与类型
概念:数据库约束是指对数据库表中的数据所施加的规则或条件,用于确保数据的准确性和可靠性。这些约束可以是基于数据类型、值范围、唯一性、非空等规则,以确保数据的正确性和相容性。
约束类型
2.NOT NULL 非空约束
定义表时某列不允许为NULL时,可以为列添加非空约束。
对于明确不会为空的列,建议主动添加该约束,这不仅保障数据完整性,也能优化查询效率。
举例:创建一个学生表,约束学生名的列不能为NULL。
•为所有列添加非空约束
•由于name列有非空约束,插入NULL值时报错。
•正常值可以成功插入
drop table if exists student; create table student( id bigint, name varchar(20) not null );NULL列为NO表示值不允许为NULL,YES表示值可以为NULL。
•查看表结构,name列的Null 属性值为NO。
3.DEFAULT 默认值约束
DEFAULT 约束用于向列中插入默认值,如果没有为列设置值,那么会将默认值设置到该列。
举例:为年龄列加入默认值
•重构学生表,新增年龄列,为年龄列加入默认约束。
•插入一条记录,不指定年龄的值时列使用了默认值(若没有设置默认约束时会为NULL)。
drop table student; create table student ( id bigint, name varchar(20) not null, age int default 18 );•查看表结构,age列的Default 属性值为18。
4.UNIQUE 唯一约束
指定了唯一约束的列,该列的值在所有记录中不能重复,比如⼀个人的身份证号,学生的学号等。
对于明确是唯一的列,建议主动添加该约束,这不仅保障数据完整性,也能优化查询效率。
注意:唯一约束只确保非 NULL 值的唯一性,通常允许存在多个 NULL值。
举例:设置学号唯一
•重构学生表,新增学号列并设置唯一约束。
•插入重复的学号时报错,唯一约束生效。
drop table student; create table student ( id bigint, name varchar(20) not null, age int default 18, sno varchar(10) unique );•查看表结构,sno列的Key 属性值为UNI,表示该学号列已成功添加唯一约束。
5.PRIMARY KEY 主键约束
5.1定义
5.2示例
举例:将学生表的id 列设为主键
•重构学生表,为id列添加主键约束。
•查看表结构,id列的Key 属性值为PRI,表示id已被成功设为主键。
drop table student; create table student ( id bigint primary key, name varchar(20) );•当Id列的重复时会发生主键冲突
通常把主键列设置为自动增长,让数据库维护主键值,一个表中只能有一个自增列。
•重构学生表,将学生表的id 列设为自增主键。
•插入数据时,设置主键列的值为NULL或不设置主键列的值(推荐),主键列的值都会自动生成。
drop table student; create table student ( id bigint primary key auto_increment, name varchar(20), age int );•查看表结构,id列的Extra 属性值为auto_increment表示自增。
•如果某条记录写入失败,新生成的主键值将会作废。
由于id 重复,产生了唯一冲突,导致插入失败,ID为3的主键值作废。
修改 id 后成功插入数据,查询后发现新记录 id 列的值为4。
•主键值可以不连续,手动指定⼀个值,下一次自增从主键的最大值开始。
当然也可以手动指定中间的值,但是下一次自增仍从主键的最大值开始。
•主键或唯一键有冲突时的更新操作
•替换,如果存在冲突则替换,不存在冲突则插入。
•一个表中只能有一个主键
一个主键可以包含多个列
•复合主键,由多个列共同组成的主键,主键是否冲突以多个列的组成进行判定。
6.FOREIGN KEY 外键约束
举例:
•创建班级表(主表),并初始化数据
•重构学生表(从表),加入外键约束
create table class ( id bigint primary key auto_increment, name varchar(20) not null );# 创建外键约束 class_id bigint, foreign key (class_id) references class(id)•查看表结构,class_id列的Key 属性值为MUL,表示该列已成功添加外键约束。
•正常向从表中插入数据,班级编号在主表中存在,插入成功。
•插入班级Id为NULL的记录,可以成功,表示当前学生还没有分配班级。
•删除主表前,请先处理依赖关系,可选择删除从表或解除所有外键约束或清空从表数据。
解除所有外键约束
清除从表数据