文章目录
约束
一种限制,用于限制表中的数据,为了保证表中的数据的精准和可靠性
六大约束
类型 | 作用 |
---|---|
NOT NULL | 非空,该字段值不能为空 |
DEFAULT | 默认,保证该字段有默认值 |
PRIMARY KEY | 主键,保证唯一性并且非空 |
UNIQUE | 保证唯一性,可以为空 |
CHECK | 检查约束(MySQL不支持) |
FOREIGN KEY | 用于限制两个表的关系,保证该字段的值必须来自于主表的关联列的值,在从表添加外键约束,用于引用主表中某列的值 |
添加约束的时机
创建表时
添加列级约束
create table student(
id int primary key,
name varchar(20) not null,
gender char(1) check(gender='男' or gender='女'),
seat int unique,
age int default 18,
majorId int references major(id)
);
create table major(
id int primary key,
majorName varchar(20)
);
查看student中的所有索引,包括主键、外键、唯一
show index from student;
添加表级约束
drop table if exists student;
create table student(
id int,
name varchar(20),
gender char(1),
seat int,
age int,
majorId int,
constraint pk primary key(id),
constraint uq unique(seat),
constraint ch check(gender='男' or gender='女'),
constraint fk_student_major foreign key (majorId) references major(id)
);
通用写法
create table if not exists student(
id int primary key,
name varchar(20) not null,
sex char(1),
age int default 18,
seat int unique,
majorId int,
constraint fk_student_major foreign key(majorId) references major(id)
);
修改表时
添加非空约束
alter table 表名 modify column 列名 类型 not null;
添加默认约束
alter table 表名 modify column 列名 类型 default 值;
添加主键
列级约束
alter table 表名 modify column 列名 类型 primary key;
表级约束
alter table 表名 add primary key(列名);
添加唯一
列级约束
alter table 表名 modify column 列名 类型 unique;
表级约束
alter table 表名 add unique(列名);
添加外键
alter table 表名 add constraint 外键名 foreign key(列名) references 主表名(关联列名);
删除非空约束
alter table 表名 modify column 列名 类型 null;
删除默认约束
alter table 表名 modify column 列名 类型;
删除主键
alter table 表名 drop primary key;
删除唯一
alter table 表名 drop index 索引名
查看索引
show index from 表名;
删除外键约束
alter table 表名 drop foreign key 外键名;
约束的添加分类
类型 | 支持 |
---|---|
列级约束 | 六大约束上都支持,但 |
表级约束 | 除了非空、默认,其它都支持 |
create table 表名(
字段名 字段类型 列级约束,
字段名 字段类型,
表级约束
);
主键和唯一约束对比
唯一性 | 是否允许为空 | 一个表中允许有多少个 | 是否允许组合 |
---|---|---|---|
主键 | 是 | 否 | 至多有一个 |
唯一 | 是 | 是 | 可以有多个 |
外键
- 要求在从表中设置外键关系
- 从表的外键列类型和主表的关联列类型要求一致或兼容,名称无要求
- 主表的关联列必须是一个key(一般是主键或唯一)
- 插入数据时,先插入主表,再插入从表
- 删除数据时,先删除从表,再删除主表
级联删除
alter table 表名 add constraint 外键名 foreign key(列名) references 主表名(关联列) on delete cascade;
级联置空
alter table 表名 add constraint 外键名 foreign key(列名) references 主表名(关联列) on delete set null;
标识列(自增键)
自增长列,不用手动插入值,系统提供默认序列值
- 标识列必须和主键搭配吗?不一定,但要求是一个key
- 一个表可以有至多一个标识列
- 标识列的类型必须是数值型
- 标识列可以通过set auto_increment_increment=n;设置步长
- 可以通过手动插入值,设置起始值
创建表时设置标识列
drop table if exists 表名;
create table 表名(
id int primary key auto_increment,
)
查看自增属性
show variables like '%auto_increment%';
设置自增步长
set auto_increment_increment=n;
修改表时设置标识列
alter table 表名 modify column 列名 int primary key auto_increment;
修改表时删除标识列
alter table 表名 modify column 列名 int;