-
外键约束介绍
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
相关推荐
island131410 小时前
【Redis#10】渐进式遍历 | 数据库管理 | redis_cli | RES心想事成的幸运大王10 小时前
Redis的过期策略倔强的石头_10 小时前
CentOS 上安装KingbaseES(ISO包)详细教程2401_8979300611 小时前
使用Docker轻松部署Neo4j图数据库诗句藏于尽头11 小时前
Django模型与数据库表映射的两种方式寻星探路11 小时前
数据库造神计划第六天---增删改查(CRUD)(2)盖世英雄酱5813612 小时前
Read timed out问题 排查云动雨颤13 小时前
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程RestCloud14 小时前
Kafka实时数据管道:ETL在流式处理中的应用