MySQL中的常见约束
1.什么是约束
- 约束就是一种限制,用于限制数据库中表的列或行的数据。
2.使用约束有什么用
- 为了保证数据库中的数据的准确和可靠性。比如说我有一个学生表,我想查找根据学号查询唯一的一名学生。这时候就需要学生表中学生的id是不能重复。这里的id就需要使用约束。
3.约束的分类以及各约束的作用
- NOT NULL :非空,用于限制该字段的值不能为空。比如学号,姓名
- DEFAULT:默认,用于给字段设置默认的值。比如性别
- PRIMARY KEY:主键,用于保证该字段唯一且非空。比如学号员工编号
- UNIQUE:唯一,用于保证该字段唯一,但是可以为空
- CHECK:检查约束,在MySQL中没有效果,用于给字段中的值的插入添加限制条件。比如年龄不能小于0,性别不能为中。
- FOREIGN KEY:外键,用于保证字段的值必须来自主表中的关联表中的值。比如:学生表中的专业字段来自主表专业表。这里添加外键的表是从表。
4.外键约束FOREGIN KEY的修饰表的位置
- 字段约束:在表中字段类型的后面添加,但是在MySQL中没有效果
- 表约束:在表中所有字段之后添加
create table 表名 (
字段名 字段类型 字段外键约束
...
外键的表约束
)
6.约束添加的分类和是否支持
一个字段可以添加多个约束
- 列级约束:六中约束都支持但是外键约束和检查约束没有效果
- 表级约束:除了非空、默认和检查约束都支持
使用约束建表
1.列级约束建表
注意只支持主键,默认,非空,唯一约束
create table studentinfo (
id int primary key,#主键
stuName varchar(20) not null,#非空
gender char(1) check (gender = '男' or gender = '女'),#检查约束写在此处没效果
seat int unique,#唯一可以为空
age int default 18, #默认约束为18
majorId int references major(id) #外键,写在此处没效果
)
create table majorinfo (
id int primary key,
subjects varchar(20),
)
2.表级约束建表
列级约束只支持唯一,主键,外键,检查约束(但没效果)。
语法:[constraint 约束名] 约束类型(字段名),其中constraint 约束名可省略。
create table stuinfo (
id int,
stuName varchar(20),
gender char(1),
seat int,
age int,
majorId int,
constraint pk primary key(id),
constraint uq unique(seat),
constraint ck check(gender = '男' or gender = '女')
constraint fk_stuinfo_major foreign key(majorId) references major(id)
)
3.建表时约束的通用写法
由于有些约束写在字段或表的时候没有效果,所以总结一套约束都有效的建表写法
create table stuinfo (
id int primary key,
stuName varchar(20) not null,
gender char(1),
seat int unique,
age int default 18,
majorId int,
constraint fk_stuinfo_major foregin key(majorId) references major(id)
)
- 修改表时添加约束
语法:
# 添加列级约束
alter table 表名 modify column 字段名 字段类型 新约束
# 添加表级约束
alter table 表名 add [constraint 约束名] 约束类型(字段名) [外键的引用]
例子:
# 添加主键约束
# 列级约束
alter table stuinfo modify column id int primary key
# 表级约束
alter table stuinfo add primary key(id)
# 添加外键约束
alter table stuinfo add foreign key(majorId) references major(id)
删除表的约束
1.使用alter更改列
语法:
alter table 表名 modify column 字段名 字段类型;#后面不加约束默认没有约束
例子:
alter table stuinfo modify column stuName varchar(20);
2.使用drop
语法:
alter table drop 约束 [约束名],
#如果表中只有一个该约束,可以不加约束名例如主键
例子:
# 删除表中的主键约束
alter table stuinfo drop primary key;
#删除表中的唯一约束
alter table stuinfo drop index seat;
#删除表中的外键约束
alter table stuinfo drop foreign key fk_stuinfo_major;
主键和非空的区别
保证唯一性 | 是否允许为空 | 一个表中可以有多个 | 是否允许组合 | |
主键 | √ | × | × | √,但不推荐 |
唯一 | √ | √ | √ | √,但不推荐 |
外键的特点
- 添加了外键的表叫做从表,被引用的表叫主表
- 在添加外键约束时必须先创建主表插入数据,然后再创建子表后添加外键。
- 删除表时要先删除从表然后再删除主表
- 从表设置外键的字段的类型必须和主表的字段类型一样或兼容