Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > mysql外键约束

MySQL外键约束与多表查询操作方法

作者:Doro再努力

文章介绍了MySQL中的多表关系和外键约束,包括一对一、一对多/多对一、多对多关系的实现方法,以及外键约束的定义、特点、创建方式和数据操作,通过实例展示了如何在多对多关系中使用中间表,并通过创建和删除外键约束来管理表之间的关联关系,感兴趣的朋友跟随小编一起看看吧

前言

        实际开发中,一个项目通常需要很多张表才能完成。例如:一个商城项目就需要分类表(category)、商品表(products)、订单表(orders)等多张表。且这些表的数据之间存在一定的关系,接下来我们将在单表的基础上,一起学习多表方面的知识。

一、多表关系

MySQL多表之间的关系可以概括为:一对一、一对多/多对一、多对多

1.1一对一关系

1.2一对多/多对一

1.3多对多

二、外键约束

2.1简介

        MySQL外键约束(FOREIGN KEY)是表的一个特殊字段,经常与主键约束一起使用。对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表(父表)外键所在的表就是从表(子表)

        外键用来建立主表与从表的关联关系,为两个表的数据建立连接,约束两个表中数据的一致性和完整性。比如,一个水果摊,只有苹果、桃子、李子、西瓜等4种水果,那么,你来到水果摊要买水果就只能选择苹果、桃子、李子和西瓜,其它的水果都是不能购买的。

2.2特点

        定义一个外键时,需要遵守下列规则:

2.3创建外键约束

方式1-在创建表时设置外键约束

在 create table 语句中,通过[foreign key|关键字来指定外键,具体的语法格式如下:

[ constraint <外键名> ] foreign key 字段名 [,字段名2,..] references <主表名> 主键列1 [,主键列2,..]

主表-部门表:

create database mydb3;
use mydb3;
//创建部门表
create table if not exists dept(
    deptno varchar(20) primary key, -- 部门号
    name varchar(20) -- 部门名字
);

从表-员工表:

create table if not exists emp(
    eid varchar(20) primary key, -- 员工编号
    ename varhcar(20), -- 员工名字
    age int, -- 员工年龄
    dept_id varchar(20), -- 员工所属部门
    constraint emp_fk foreign key (dept_id) references dept (deptno) -- 外键约束
);

方式2-在修改表时添加外键约束

外键约束也可以在修改表时添加,但是添加外键约束的前提是:从表中外键列中的数据必须与主表中主键列中的数据一致或者是没有数据。

alter table <数据表名> add constraint <外键名> foreign key (<列名>) references
<主表名> (<列名>);

-- 创建部门表
create table if not exists dept2(
    deptno varchar(20) primary key, -- 部门号
    name varchar(20) -- 部门名字
);
-- 创建员工表
create table if not exists emp2(
    eid varchar(20) primary key, -- 员工编号
    ename varhcar(20), -- 员工名字
    age int, -- 员工年龄
    dept_id varchar(20), -- 员工所属部门
);
-- 创建外键约束
alter table emp2 add constraint dept_id_fk foreign key (dept_id) references dept2 (deptno) 

2.4外键约束下的数据操作

2.4.1数据插入

-- 1、添加主表数据
-- 注意必须先给主表添加数据
insert into dept values('1001','研发部');
insert into dept values('1002','销售部');
insert into dept values('1003','财务部');
insert into dept values('1004','人事部');
-- 2、添加从表数据
-- 注意给从表添加数据时,外键列的值不能随便写,必须依赖主表的主键列
insert into emp values('1','乔峰',20,'1001');
insert into emp values('2','段誉',21,'1001');
insert into emp values('3','虚竹',23,'1001');
insert into emp values('4','阿紫',18,'1002');
insert into emp values('6','李秋水',33,'1003');
insert into emp values('7','鸠摩智',50,'1003');
insert into emp values('8','天山童姥',60,'1005'); -- 不可以

2.4.2数据删除

-- 1、主表的数据被从表依赖时,不能删除,否则可以删除
-- 2、从表的数据可以随便删除
delete from dept where deptno = '1001'; -- 不可以删除
delete from dept where deptno = '1004'; -- 可以删除
delete from emp where eid = '7'; -- 可以删除
dept from emp; -- 可以删除

2.5删除外键约束

当一个表中不需要外键约束时,就需要从表中将其删除。外键一旦删除,就会解除主表和从表间的关联关系。

alter table<表名> drop foreign key <外键约束名>;

alter table emp2 drop foreign key dept_id_fk;

三、多对多外键约束

在多对多关系中,A表的一行对应B的多行,B表的一行对应A表的多行,我们要新增加一个中间表,来建立多对多关系。

3.1创建学生表

-- 1、创建学生表student(左侧主表)
create table if not exists student(
    sid int primary key auto increment,
    name varchar(20),
    age int,
gender varchar(20)
);

3.2创建课程表

-- 2、创建课程表course(右侧主表)
create table course(
    cid int primary keyauto increment,
    cidname varchar(20)
);

3.3创建中间表

-- 3、创建中间表student_course/score(从表)
create table score(
    sid int,
    cid int,
    score double
);

3.4创建外键约束(2次)

-- 4、建立外键约束
alter table score add foreign key(sid) references student(sid);
alter table score add foreign key(cid) references course(cid);

3.5添加学生数据

-- 5、添加学生数据
insert into student values
(1,'小龙女',18,'女'),
(2,'阿紫',19,'女'),
(3,'周芷若',20,'男');

3.6添加课表数据

insert into course values
(1,'语文'),
(2,'数学'),
(3,'英语');

3.7添加中间表数据

insert into score values
(1,1,78),
(1,2,79),
(2,1,88),
(2,3,82),
(3,2,90),
(3,3,69);

到此这篇关于MySQL外键约束与多表查询基础的文章就介绍到这了,更多相关mysql外键约束内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文