数据库表的约束
作用:对表中的数据进行限制,保证数据的正确性、有效性和完整性。一个表如果添加了约束,不正确的数据将无法插入到表中。约束在创建表的时候添加比较合适。
约束种类
约束名 | 约束关键字 | 说明 |
---|---|---|
主键 | primary key | 唯一,非空 |
默认 | default | 没值则使用默认值 |
唯一 | unique | 不能有重复值(null表示无数据,可以重复) |
非空 | not null | 必须有值 |
外键 | foreign key | 主表中主键字段,从表中外键列 |
检查约束 | check 注意:mysql不支持 | 不支持 |
一、主键约束
注意
- 主键数在一个表中,只能有一个。不能出现多个主键。主键可以单列,也可以是多列【复合主键】。
- 自增长只能用在主键上
主键用于为标识数据库中的每一条记录;通常不用业务字段作为主键,单独给每张表设计一个 id 的字段,把 id 作为主键。主键是给数据库和程序使用的,不是给最终的客户使用的。所以主键有没有含义没有关系,只要不重复,非空就行。
- 特点:非空;唯一
1.创建主键
# 创建时添加主键
create table student (
id int primary key,
name varchar(20));
# 指定多条字段为主键
create table morePr(
id int,
name varchar(20),
age int,
primary key (id,name)
)
# 创建后补上
alter table student add primary key(id);
alter table student modify id int primary key;
2.删除主键
添加了auto_increment约束的主键无法删除主键约束
alter table student drop primary key;
3.主键自增
主键如果让我们自己添加很有可能重复,我们通常希望在每次插入新记录时,数据库自动生成主键字段的值
字段类型必须是整数类型。
# 创建时添加
create table student (
id int primary key auto_increment,
name varchar(20));
# 插入时在主键位置可以写null,会自动按照之前逻辑进行增长!
# 在插入数据的时候可以不指定主键。
# 创建后添加
alter table student modify id int auto_increment;
- 修改自增长起始值,默认从 1 开始
# 创建时修改
create table student(
id int primary key auto_increment,
name varchar(10)
) auto_increment = 8;
# 创建后修改
alter table student auto_increment = 9;
delete对自动增长无影响,truncate会重置!
删除自动增长,重置修改!
alter table student modify id int;
二、nuique唯一约束
null没有数据,不存在重复问题
# 创建时添加
create table student(
id int unique
);
# 创建后添加
alter table student modify id int nuique;
删除唯一约束,index
alter table student drop index id;
三、not null 非空约束与default默认值
- 非空约束
# 创建时添加
create table student(
id int not null
);
# 创建后添加
alter tabl student modify id int not null
#删除非空约束
alter table student modify name varchar(20);
-默认值
create table student(
id int,
name varchar(20) default "小明"
);
四、外键约束
外键:
- 从表中与主表主键对应的呢一列
- 主表:一方、约束别人的的表
- 从表:多方、被别人约束的表
1.创建约束语法
# 创建时完整语法
create table calss(
id int,
外键字段名 ?,
[constraint] [外键约束名称]
foreign key (外键字段名)
references 主表名(主表主键字段名)
);
# 已有表增加外键:
alter table 从表 add [constraint] [外键约束名称]
foreign key (外键字段名)
references 主表(主键字段名);
2.删除外键
如果在指定外键时没有指定外键名[constraint 外键约束名称],mysql会添加一个默认名称!可通过show create table 表名进行查看。
alert table 从表 drop foreign key 外键约束名称;
alter table student drop foreign key stu_cla;
3.外键的级联【开发中使用的非常谨慎!】
直接删除和修改主表中的主表是不予许的!需要指定级联操作!
级联操作:在修改和删除主表的主键时,同时更新或删除副表的外键值,称为级联操作
级联操作 | 描述 |
---|---|
on update cascade | 级联更新,只能是创建表的时候创建级联关系,更新主表中的主键,从包中的外键列也自动同步更新 |
on delete cascade | 级联删除 |
create table student (
...
class_id int,
constraint student_class
foreign key (class_id)
references class(c_id)
on delete cascade
on update cascade
);
取消级联的步骤:删除外键,再次添加外键
alter table employee drop foreign key 外键名;
alter table employee add foreign key (dep_id) references department(id);