-
外键约束介绍
Mysql外键约束(foreign key)是表的一个特殊字段,常与主键约束一起使用。外键约束是一种用于维护两个表之间数据一致性的方法。它确保引用表中的每个值都存在于主表中的某个列中。外键约束通常用于实现数据库的参照完整性。对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表(父表),外键所在的表就是从表(子表)。
-
定义外键的规则
1、主表必须已经存在于数据库中,或者是当前正在创建的表。
2、必须为主表定义主键。
3、主键不能包含空值,但允许在外键中出现空值。
4、在主表的表名后面指定列名或列名的组合,这个列或列的组合必须是主表的主键。
5、外键中列的数目必须和主表的主键中列的数目相同。
6、外键中列的数据类型必须和主表主键列的数据类型相同。
-
外键约束的创建步骤
方式1:在创建表时设置外键约束
mysql[constraint <外键名>] foreign key (字段名 [,字段名2,...]) references <主表名>(主键列1 [,主键列2,...])
方式2:通过 alter...add字段添加,前提是从表中外键列中的数据必须与主表中主键列的数据一致或是还没有数据
mysqlalter table <表名> add constarint <外键名> foreign key(<列名>) references <主表名>(<列名>)
eg1:一对多关系表中创建外键约束
mysqlcreate database db; --创建数据库db use db; -- 创建部门表(主表) create table if not exists department( deptno varchar(8) primary key comment '这是部门编号', depname varchar(16) --这是部门编号 )charset=utf8; -- 创建员工表(从表) create table if not exists staff( sid varchar(16) primary key, --员工编号 sname varchar(16), --员工姓名 age int, --员工年龄 dep_id varchar(8), --员工所属部门编号 foreign key (dep_id) references department(deptno) )charset=utf8;
eg2:多对对关系表中外键约束的创建通常会利用中间表将两个表进行关联。如学生表和课程表,一名学生可以选多门课程,一门课程也可以被多名学生选择
mysql-- 创建学生表(主表1) create table [if not exists] students( sid int primary key auto_increment, -- 将学号设为自增主键 sname varchar(16), age int, gender enum('男','女') default '男' )charset=utf8; -- 创建课程表(主表2) create table course( cid int primary key auto_increment, -- 将课程id设为自增主键 cname varchar(32) )charset=utf8; -- 创建中间表mid_stu_course create table mid_stu_course( sid int, cid int, score double )charset=utf8; -- 分2次建立外键约束 alter table mid_stu_course add foreign key(sid) references students(sid); alter table mid_stu_course add foreign key(cid) refernces course(cid); -- 插入数据时,中间表中的sid和cid需存在于主表中,即只能在主表的sid和cid的值中选择
-
在外键约束条件下的数据操作
1、数据插入:
-- 必须先给主表添加主键列(外键约束列)的数据
-- 给从表添加数据时,外键列的值必须依赖主表的主键列。即从表外键列插入的数据必须存在于主表主键列。
2、删除数据:
-- 从表的数据可以任意删除
-- 主表的数据被从表依赖时不能被删除,未被依赖的数据才可以删除。
-
删除外键约束
mysqlalter table table_name drop foreign key <外键约束名>;
MySQL多表操作--外键约束多表关系
匿名-59722024-10-14 4:05
相关推荐
DCTANT10 分钟前
【原创】国产化适配-全量迁移MySQL数据到OpenGauss数据库程序员岳焱1 小时前
Java 与 MySQL 性能优化:MySQL全文检索查询优化实践喜欢敲代码的程序员2 小时前
SpringBoot+Mybatis+MySQL+Vue+ElementUI前后端分离版:项目搭建(一)AI、少年郎2 小时前
Oracle 进阶语法实战:从多维分析到数据清洗的深度应用(第四课)赤橙红的黄2 小时前
自定义线程池-实现任务0丢失的处理策略钢铁男儿2 小时前
C# 委托(调用带引用参数的委托)叁沐3 小时前
MySQL 02 日志系统:一条SQL更新语句是如何执行的?DataGear3 小时前
如何在DataGear 5.4.1 中快速制作SQL服务端分页的数据表格看板weixin_438335403 小时前
分布式锁实现方式:基于Redis的分布式锁实现(Spring Boot + Redis)RunsenLIu3 小时前
基于Vue.js + Node.js + MySQL实现的图书销售管理系统