主键约束
- 说明:1张表中最多只能有1个主键(可以没有)。主键可以是1个属性,也可以是由多个属性同时组成
- 主属性的值不能为空,不能重复
- 方式1:列级,`属性1 数据类型 primary key`
# 创建学生表,学号作为主键
create table if not exists student(
st_no char(10) primary key, # 主键约束
st_name varchar(20),
st_age tinyint,
st_gender char(1),
st_date date
)engine=innodb charset="utf8" collate="utf8_general_ci";
- 方式2:表级,`constraint 主键名称 primary key(属性1,属性2,...)`
- `constraint 主键名称`,可选的,指定主键的名称,如果省略系统会为主键自动生成一个名称
# 创建成绩表,学号+课程号为主键
create table if not exists score(
st_no char(10), # 学号
cu_no char(4), # 课程号
score tinyint, # 成绩
constraint pk_sc primary key(st_no,cu_no) # 主键约束
)engine=innodb charset="utf8" collate="utf8_general_ci";
```
外键约束
- 概念:两张表A、B,A表中的属性s(可以是主属性或者非主属性)出现在B表中(不作为B表的主属性),此时将B表中的属性s(可能叫其他名字)称为外键,A表为主表,B表为子表
- 外键约束:子表中不能引用主表中不存在的值
- 注意:子表引用主表中非主属性时,需要为该属性设置索引
- 语法:`constraint 外键名 foreign key (属性名) references 主表名(属性) on delete cascade on update cascade`
- `constraint 外键名`,可选的,指定外键名称,省略时系统自动命名
- `foreign key (属性名)`,表示在子表的哪个属性上创建外键
- `references 主表名(属性)`,表示引用主表的哪个属性
- `on delete cascade`,可选的,级联删除,表示主表数据被删除时,联动删除子表中对应的数据
- `on update cascade`,可选的,级联修改,表示主表数据被修改时,联动修改子表中对应的数据。如果省略,则主表的数据不允许变动(默认)
# 创建学生表,学号作为主键
create table if not exists student(
st_no char(10) primary key, # 主键约束
st_name varchar(20),
st_age tinyint,
st_gender char(1),
st_date date
)engine=innodb charset="utf8" collate="utf8_general_ci";
# 创建成绩表,学号为外键,引用学生表中的学号
create table if not exists score(
st_no char(10), # 学号
cu_no char(4), # 课程号
score tinyint, # 成绩
# 创建外键
constraint fk_stno foreign key (st_no) references student(st_no)
on update cascade on delete set null
)engine=innodb charset="utf8" collate="utf8_general_ci";
唯一约束
- 语法:`属性 数据类型 unique`,属性的值不能重复
非空约束
- 语法:`属性 数据类型 not null`,属性的值不能为空
检查约束
- 语法:`属性 数据类型 check(条件)`,属性的值必须满足指定条件(mysql 8以上版本支持)
- mysql 8以下版本对于离散值,比如性别的男或者女,可以通过`set`或者`enum`实现。
-enum和set的区别:set可选择多个选项,enum只能单选。
默认值
- 语法:`属性 数据类型 default 值`,放在其他约束之后
自增长
- 语法:`属性 数据类型 auto_increment`,只能用在主键上
- 例:
# 创建学生表,学号作为主键
create table if not exists student(
st_no char(10) primary key, # 主键约束
st_name varchar(20) not null, # 非空约束
st_age tinyint not null,
st_gender char(1) not null default "男", # 非空约束+默认值
st_phone char(11) unique not null,
st_date date not null
)engine=innodb charset="utf8" collate="utf8_general_ci";
# 创建课程表
create table if not exists course(
cu_no char(4) primary key,
cu_name varchar(20) not null unique
)engine=innodb charset="utf8" collate="utf8_general_ci";
# 创建成绩表,学号为外键,引用学生表中的学号
create table if not exists score(
id int auto_increment primary key,
st_no char(10) not null, # 学号
cu_no char(4) not null, # 课程号
score enum("A","B","C","D"), # 成绩
# 创建外键
foreign key (st_no) references student(st_no) on update cascade on delete cascade,
foreign key (cu_no) references course(cu_no) on update cascade on delete cascade
)engine=innodb charset="utf8" collate="utf8_general_ci";