一种限制,限制表中数据,保证数据一致性。
分类:六大约束
1.非空约束 not null 保证字段不为空;
2.默认约束 default 保证字段有默认值;
3.主键约束 primary key 保证字段具有唯一性并且非空;
4.唯一约束 unique 保证字段唯一可以为空;
5.检查约束 check 【MySQL不支持】用来加判断条件;
6.外键约束 foreign key 用于限制两个表的关系,用于保证该字段的值必须来自于主表关联列的值;(在从表添加外键约束,用于引用主表中某列的值)
添加约束的时机:
1.创建表时;2.修改表时;
约束的添加分类:
列级约束:语法都支持,但外键约束没有效果;
标记约束;除了非空、默认,其他都支持;
创建表时添加约束
可以同时添加多个约束
1.添加列级约束(支持主键、非空、unique、default)
create table stuinfo(
id int primary key,#主键
stuName varchar(20) not null,#非空
gender char(1) check(gender='男' or gender ='女'),#检查
seat int unique,#唯一
age int default 18,#默认
majorId int foreign key references major(id)#外键没用
);
create table major(
id int primary key,
majorName varchar(20)
);
显示索引,主键,外键,唯一自动生成索引
show index from stuinfo;
2.添加表级约束
drop table if exists stuinfo ;
create table stuinfo(
id int primary key,
stuName varchar(20) not null,
gender char(1) check(gender='男' or gender ='女'),
seat int unique,
age int default 18,
majorId int ,
constraint pk primary key(id),
constraint uq unique(seat),
constraint ck check(),
constraint fk_stuinfo_major foreign key(majorid) references major(id)
);
主键索引默认primary(MySQL中不会改变)
【constraint 约束名】可以省略,省略后默认索引为字段名
约束名不可以重复
通用写法:
create table stuinfo(
id int primary key,#主键
stuName varchar(20) not null,#非空
gender char(1) check(gender='男' or gender ='女'),#检查
seat int unique,#唯一
age int default 18,#默认
majorId int ,
constraint fk_stuinfo_major foreign key(majorid) references major(id)
);
主键和唯一的对比
保证唯一性 | 是否允许为空 | 一个表中有几个 | 是否允许组合 | |
---|---|---|---|---|
主键 | 是 | 否 | 一个 | 是 |
唯一 | 是 | 是(但只有一个) | 多个 | 是 |
组合主键:比如id,name都是表的主键(不推荐,不稳定)
外键
1.要求从表设置主键;
2.从表的外键列的类型和主表的关联列的类型一致或者兼容,名称无要求;
3.主表的关联列必须是一个key(一般主键或唯一);
4.插入数据时,先插主表,再插从表,删除数据时,先删除从表,再删除主表;
删除
方式一:级联删除
alter table stuinfo add constraint fk_stuinfo_major foreign key(majorid) references major(id) on delete cascade;
delete from major where id = 3;#从表外键为3的数据也删除
方式二:级联置空
alter table stuinfo add constraint fk_stuinfo_major foreign key(majorid) references major(id) on delete set null;
delete from major where id = 3;#从表外键数据置空
修改表时添加约束
alter table stuinfo modify column stuname varchar(20) not null;
alter table stuinfo modify column age int default 18;
alter table stuinfo modify column id int primary key;
alter table stuinfo modify add primary key(id);(表级);
alter table stuinfo modify column seat int unique;
alter table stuinfo add unique(seat);
alter table stuinfo add constraint fk_stuinfo_major foreign key(majorid) references major(id);(表级)
1.添加列级约束
alter table 表名 modify column 字段名 字段类型 新约束;
2.添加表级约束
alter table 表名 add【constraint 约束名】 约束名(字段名) 【外键的引用】;
修改表时删除约束
1.删除非空约束
alter table stuinfo modify column stuname varchar(20) null;
2.删除默认约束
alter table stuinfo modify column age int;
3.删除主键
①alter table stuinfo modify column id int;
②alter table stuinfo drop primary key;
4.删除唯一
alter table stuinfo drop index seat;
5.删除外键约束
alter table stuinfo drop foreign key fk_stuinfo_major;
位置 | 支持约束类型 | 是否可以起约束名 | |
---|---|---|---|
列级约束 | 跟在列的后面 | 语法都支持,外键没有效果 | 否 |
表级约束 | 所有列的下面 | 默认和非空不支持,其他支持 | 是(主键没有效果) |
学习整理于MySQL 基础+高级篇.