创建表的时候往往给字段加一些约束,以保证数据的 合法性、有效性、完整性。
1、非空约束:not null
非空约束针对某个字段设置其值不能为NULL
。创建表时如果有字段声明如下:字段名 数据类型 not null
,表明插入数据时必须要给这个字段赋值,如果没有就会报错。
2、唯一约束:unique
唯一性约束可令某个字段不可重复。创建表时如果有字段声明如下:字段名 数据类型 unique
,表明插入时这个字段的值不可与已经存在的数据重复,但是均可以为NULL
,称为列级约束。
如果想令几个字段合起来不可重复,可以这样声明:unique(字段名,...)
,称为表级约束,非空约束没有表级写法。
3、主键约束:primary key
3.1 pk的作用
具有pk
的字段既不能重复,也不能为NULL
。创建表时的pk
声明如下:字段名 数据类型 primary key
,称为单一主键,如果采用表级约束:primary key(字段名,...)
称为复合(联合)主键
。
字段加上pk
后称为主键字段,主键字段中的每一个值都是主键值,主键值是记录在表中的唯一标识,任何一张表中都应该有主键,且pk
只能有一个。
3.2 主键的分类
根据主键的性质可划分为自然主键和业务主键。前者的主键字段独立,与具体的业务没有关联;后者主键值和业务挂钩,比如银行卡号。
业务主键不推荐使用,因为业务后续发生改变的话,主键值随之变化,可能导致主键值相同,但是这是不允许的,反之业务也无法改变。
3.3 主键值自增
实际业务中主键值往往由服务端给出,主键值从0开始,每次插入一条数据主键值自动增1。创建表时的声明如下:字段名 数据类型 primary key auto_increment
,如果插入数据时手动给主键值赋值,下一次自增在已赋值的基础上进行。
4、外键约束:foreign key
外键可以维护表之间的关系,如果表中的某个字段为外键字段,那么外键值必须来自所选参照表对应的字段值,外键值可以为NULL
。
例如有两张表student:id(pk)、sname、classno
和class:id(pk)、cno(unique)、cname
,其中student
表中的classno
字段值必须来自class
表中的cno
,外键约束为foreign key(classno) references class(cno)
,建表语句如下:
create table class(
id int primary key,
cname varchar(255),
cno int unique
);
create table student(
id int primary key,
sname varchar(255),
classno int,
foreign key(classno) references class(cno)
);
注释
- 存在外键的表是子表(从表),参照的表是父表(主表),即两张表存在主从关系;
- 父表中作为参照的字段可以不是主键,但至少要有
unique
约束。因为一旦作为参照的字段值有重复,子表中的外键值无法确认依赖父表的哪一条记录; - 创建表和添加数据的顺序:先父表后子表;
- 删除表和删除数据的顺序:先子表后父表。
欢迎评论区交流~👍