欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 家装 > MySQL 约束(入门版)

MySQL 约束(入门版)

2025/4/19 7:31:09 来源:https://blog.csdn.net/2401_85409229/article/details/147034467  浏览:    关键词:MySQL 约束(入门版)

目录

一、约束的基本概念

二、约束演示

三、外键约束

(一)介绍

(二)外键约束语法

(三)删除/更新行为


一、约束的基本概念

1、概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。

2、目的:保证数据库中数据的正确、有效性和完整性。

3、分类

4、作用

        约束是作用于表中字段上的,可以在创建表/修改表的时候添加约束。

        非空约束、唯一约束、主键约束、默认约束、检查约束主要用于限定对应字段的数据,在DDL (数据定义语言)中使用。

        外键约束用于建立两表之间的联系,在更新与删除对应内容时,两表发生对应的变化。

二、约束演示

        上面我们介绍了数据库中常见的约束,以及约束涉及到的关键字,那这些约束我们到底如何在创建表、 修改表的时候来指定呢,接下来我们就通过一个案例,来演示一下。

        案例需求: 根据需求,完成表结构的创建。需求如下:

对应的建表语句为:

create table tb_user(id int auto_increment primary key comment 'ID唯一标识',name varchar(10) not null unique comment '姓名' ,age int check (age > 0 && age <= 120) comment '年龄' ,status char(1) default '1' comment '状态',gender char(1) comment '性别'
);

        在为字段添加约束时,我们只需要在字段之后加上约束的关键字即可如果有多个约束,则使用空格隔开。如果需要 id 字段是主键并且自增,则可以再使用关键字auto_increment。

        因为 id 列被定义为自增主键,所以插入数据时通常不需要显式地为该列指定值,数据库会自动为其生成一个唯一且递增的值。

        我们执行上面的SQL把表结构创建完成,然后接下来,就可以通过一组数据进行测试,从而验证一下,约束是否可以生效。

--这两条可以正常执行
insert into tb_user(name,age,status,gender) values ('Tom1',19,'1','男'),('Tom2',25,'0','男');
insert into tb_user(name,age,status,gender) values ('Tom3',19,'1','男');--第一条因为名字为null,第二条因为名字重复,所以这两条都不能正常执行
insert into tb_user(name,age,status,gender) values (null,19,'1','男');
insert into tb_user(name,age,status,gender) values ('Tom3',19,'1','男');--第一条可以正常执行,第二条和第三条因为年龄超过范围,所以不能正常执行
insert into tb_user(name,age,status,gender) values ('Tom4',80,'1','男');
insert into tb_user(name,age,status,gender) values ('Tom5',-1,'1','男');
insert into tb_user(name,age,status,gender) values ('Tom5',121,'1','男');--本条可以正常执行
insert into tb_user(name,age,gender) values ('Tom5',120,'男');

三、外键约束

(一)介绍

1、外键约束的基本概念        

        外键用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性。接下来,我们来看一个例子。

        左侧的emp表是员工表,里面存储员工的基本信息,包含员工的id、姓名、年龄、职位、薪资、入职日期、上级主管id、部门id。

        右侧的dept表是部门表,里面存储部门的基本信息,包括含部门的id与名字。

        在员工表emp中,部门id (dept_id)作为外键,关联部门表dept的主键id。

        具有外键的表被称为子表,外键所关联的表被称为父表所以上面的员工表emp是子表,而部门表dept是父表。

        注意:目前上述两张表,只是在逻辑上存在这样一层关系;在数据库层面,并未建立外键关联,所以是无法保证数据的一致性和完整性的。

2、外键约束测试

        没有数据库外键关联的情况下,能否保证一致性和完整性呢,我们建表来测试一下。

create table dept(id int auto_increment comment 'ID' primary key,name varchar(50) not null comment '部门名称'
)comment '部门表';
insert into dept (id, name) values (1, '研发部'), (2, '市场部'),(3, '财务部'), (4, '销售部'), (5, '总经办');
create table emp(id int auto_increment comment 'ID' primary key,name varchar(50) not null comment '姓名',age int comment '年龄',job varchar(20) comment '职位',salary int comment '薪资',entrydate date comment '入职时间',managerid int comment '直属领导ID',dept_id int comment '部门ID'
)comment '员工表';insert into emp (id, name, age, job,salary, entrydate, managerid, dept_id)
values(1, '金庸', 66, '总裁',20000, '2000-01-01', null,5),(2, '张无忌', 20, '项目经理',12500, '2005-12-05', 1,1),(3, '杨逍', 33, '开发', 8400,'2000-11-03', 2,1),(4, '韦一笑', 48, '开发',11000, '2002-02-05', 2,1),(5, '常遇春', 43, '开发',10500, '2004-09-07', 3,1),(6, '小昭', 19, '程序员鼓励师',6600, '2004-10-12',2,1);

        接下来,我们可以做一个测试,删除id为1的部门信息。

        结果,我们看到删除成功之后,部门表不存在id为1的部门,而在emp表中还有很多的员工,关联的为id为1的部门,此时就出现了数据的不完整性。 而要想解决这个问题就得通过数据库的外键约束。

(二)外键约束语法

1、添加外键

(1)在建表时添加外键

create table 表名(
        字段名 数据类型,
        ...
        [ constraint ] [外键名称] foreign key (外键字段名) references 主表 (主表列名) 
);

        在创建外键约束时,constraint 关键字是可选的,它的主要作用是为外键约束命名,方便后续对外键约束进行管理,比如删除或者修改外键约束等操作

        如果不使用 constraint 关键字,数据库会自动为约束生成一个默认名称。

        如果需要查询这默认名称,可以通过查询 information_schema.table_constraints 系统表来获取外键约束的名称。以下是一个示例查询,用于查找 employees 表的外键约束名称:

select constraint_name
from information_schema.table_constraints
where table_schema = database() and table_name = 'employees'and constraint_type = 'foreign key';

        查询中,table_schema = database()用于指定当前数据库,table_name= employees'表示要查找employees表的外键约束,constraint_type = 'foreign key'确保只查找外键约束

(2)建表后额外添加

alter table 表名

add constraint 外键名称 foreign key (外键字段名) references 主表 (主表列名) ;

        案例:为 emp 表的 dept_id 字段添加外键约束,关联dept表的主键id。

alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references dept(id);

        此时在表中可以发现,字段dept_id出现了蓝色钥匙的形状,这是外键约束;字段id显示的是黄色钥匙的形状,这是主键约束

        添加了外键约束之后,我们再到dept表(父表)删除id为1的记录,此时将会报错,不能删除或更新父表记录,因为存在外键约束。

2、删除外键

alter table 表名 drop foreign key 外键名称;

        案例:删除emp表的外键fk_emp_dept_id。

alter table emp drop foreign key fk_emp_dept_id;
(三)增加外键约束后的删除/更新行为

1、具体的删除/更新行为

        添加了外键之后,再删除父表数据时产生的约束行为,我们就称为删除/更新行为。具体的删除/更新行为有以下几种:

        如果没有规定对应的行为,默认行为是restrict,同时no action与其作用一致。

        cascade 的作用是级联。如果父表的内容被删除了,其对应子键所在行的数据也会被删除。如果父表的内容被更新了,其对应子键也会更新对应内容。

        在父键的内容被删除时,如果有对应外键,set null 会将其设置成 null,set default会将其设置为一个默认的值。

2、具体的语法

alter table 表名

add constraint 外键名称 foreign key (外键字段) references 主表名 (主表字段名)

on update (更新行为) on delete (删除行为);

3、具体演示

        由于 restrict 是默认行为,我们前面语法演示时,已经测试过了,就不再演示了,这里我们再演示其他的两种行为:cascade、set null。

(1)cascade

alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references dept(id) on update cascade on delete cascade ;

修改父表id为1的记录,将id修改为6

        我们发现,原来在子表中dept_id值为1的记录,现在也变为6了,这就是cascade级联的效果。在一般的业务系统中,不会修改一张表的主键值。

② 删除父表id为6的记录

(2)set null

        在进行测试之前,我们先需要删除上面建立的外键 fk_emp_dept_id。然后再通过数据脚本,将emp、dept表的数据恢复了。

        接下来,我们删除id为1的数据,看看会发生什么样的现象。

        我们发现父表的记录是可以正常的删除的,父表的数据删除之后,再打开子表 emp,我们发现子表emp的dept_id字段,原来dept_id为1的数据,现在都被置为null了。这就是 set null 这种删除/更新行为的效果。
        
        以上即为MySQL 约束(入门版)的全部内容,创作不易,麻烦三连支持一下呗~  

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词