MySQL——数据库约束

发布于:2025-08-04 ⋅ 阅读:(12) ⋅ 点赞:(0)

一.什么是数据库约束?它的目的是什么?

数据库约束是指对数据库表中的数据所施加的规则或条件。

目的是确保数据的准确性和可靠性。

二.约束类型

1).not null 非空约束:

指定⾮空约束的列不能存储NULL值。

例:

我们创建了如下表,

create table student(
id int,
name varchar(20) not null,
profession varchar(20)
)charset utf8;

 接下来我们对表中正常插入数据:

insert into student values(1,'张三','医生'),(2,'李四','护士'),(3,'王五','医生'),(4,'赵六','护士'),(5,'孙七','医生');

 可以发现代码正常运行了,接下来我们尝试插入其他代码:

insert into student(id)values(1);

 

我们可以发现插入失败了,正常情况下我们是可以插入成功的,但由于 name 列有了非空约束,系统提示我们 name 没有默认约束,也就是 name 列不能为空。

2).default  默认约束:

当没有给列赋值时使⽤的默认值。

例:

我们创建如下表

create table student(
id int,
name varchar(20) not null,
profession varchar(20) default '空'
)charset utf8;

 我们在表中插入如下数据:

insert into student (id,name)values(1,'张三');

  我们可以看到,我们并没有插入 profession 的数据,但 profession 写为了空,这就是 default 默认约束的作用。

3).unique  唯一约束:

指定唯⼀约束的列每⾏数据必须有唯⼀的值。

例:

如下表

create table student(
id int unique,
name varchar(20) not null,
profession varchar(20) default '空'
)charset utf8;

 我们往表里插入如下数据:

insert into student values(1,'张三','医生'),(2,'李四','护士'),(3,'王五','医生');

 以上语句成功执行,接下来我们再插入一条数据:

insert into student values(1,'赵六','医生');

 此时插入错误,就是 unique 唯一约束发挥了作用,因为 id 为 1 的数据已经有了,不允许重复导致插入失败。

4).primary key 主键约束:

not null 和 unique 的结合,可以指定⼀个列或多个列,有助于防⽌数据重复和提⾼数据的查询性能。

例:

由于主键是 not null 和 unique 的结合,所以我们可以同时设置 not null 和 unique 来实现主键,如下语句:

create table student(
id int unique not null,
name varchar(20) not null,
profession varchar(20) default '空'
)charset utf8;

 此时我们查看表结构:

desc student;

 

 可以发现 id 的 key 列 显示 prl,此时 id 就被设为了主键。

此外设置主键的方法:

第二种:

create table student(
id int primary key,
name varchar(20) not null,
profession varchar(20) default '空'
)charset utf8;

 第三种:

create table student(
id int primary key auto_increment,
name varchar(20) not null,
profession varchar(20) default '空'
)charset utf8;

 以上三种方法虽然都把 id 设置为了主键,但第三种方法跟前两种方法是有区别的,我们称这种主键为自增主键,以 id 这行为例,当我们插入数据的时候不设置 id 列的值,我们会发现我们插入的数据是由 id 列的,这是因为主键列会自动增长的,用来维护主键值。

例:

create table student(
id int primary key auto_increment,
name varchar(20) not null,
profession varchar(20) default '空'
)charset utf8;
insert into student values(1,'张三','医生'),(2,'李四','护士'),(3,'王五','医生');

 我们对上述表插入如上数据,接下来我们再插入其他数据:

insert into student(name,profession) values('赵六','医生'),('孙七','护士');

 我们并没有设置 id 的值,但是插入表中的数据有 id 值,这就是自增主键的作用。

我们要注意,我们还是可以自己设置 id 的值来插入数据的:

insert into student values(999,'赵六','医生');

注意:如果接下来我们对数据不设置 id 列,直接插入数据,我们会发现 id 是从 1000 开始的。

 查看表结构, extre 里面就显示是否是自增主键。

一个表不能拥有多个主键!但可以拥有复合主键。

 更新或插入数据:

以下代码可以在拥有主键的表中来更新数据或插入数据,当主键重复时,会更新主键的内容,当主键不重复时,就会插入内容:

replace into student values(1,'赵六','医生');

 复合主键:

create table student(
id int,
name varchar(20) not null,
profession varchar(20) default '空',
primary key auto_increment(id,name)
)charset utf8;

 此时这张表的主键由 id 和 name 一起决定。

5).foreign key 外键约束:

外键约束是⼀种关系约束,⽤于定义两个表之间的关联关系,可以确保数据的完整性和⼀致性。

 例:

 如下我们创建了两张表,其中 class 表为主表。

create table class(
id int primary key auto_increment,
class varchar(20)
)charset utf8;

insert into class values(1,'一班'),(2,'二班');
create table student(
id int,
name varchar(20) not null,
classid int,
foreign key (classid) references class(id)
)

insert into student values(1,'张三',1),(2,'李四',2),(3,'王五',2),(4,'赵六',1),(5,'孙七',2);

创建好以上表并且初始化数据之后,接下来我们尝试删除主表 class 里面的数据:

delete from class where id =1;

可以看到删除失败了,这是因为从表 student 里面有数据引用了主表中的内容1导致我们不能删除。

接下来我们尝试删除主表 class:

drop table class;

也是失败的,所以我们删除主表之前要先删除从表。 

删除外键:

首先我们要查询外键约束名:

show create table student; 

通过create table 里面的内容我们可以找到外键约束名:

以上是 create table 里面的内容, 其中 就是我们要寻找的约束名,

此时我们通过以下语句就可以删除外键约束:

alter table 表名 drop foreign key 约束名;

6).check 检查约束:

⽤于限制列或数据在数据库表中的值,确保数据的准确性和可靠性。(可以应用于多个列)。

 我们创建一个学生表,要求表里的学生数据年龄必须 > 18;


create table student(
id int,
name varchar(20) not null,
age int check (age > 18)
)charset utf8;

此时我们插入数据:

insert into student values(1,'张三',19),(1,'李四',20);
insert into student values(1,'王五',16);

 正常情况下 第一条语句是可以执行成功的,而第二条语句是执行失败的,但由于在 MySQL 8.0.16之前的版本中,check 约束会被忽略掉,所以此处不展示使用效果。


网站公告

今日签到

点亮在社区的每一天
去签到