首页
学习
活动
专区
圈层
工具
发布

mysql 一张表有三个外键怎么写

在MySQL中,一张表有三个外键意味着这张表需要与其他三张表建立关联关系。下面是一个关于如何创建这样一张表的示例。

假设我们有以下四张表:

  1. students(学生表)
  2. courses(课程表)
  3. teachers(教师表)
  4. student_courses_teachers(学生选课及教师表)

student_courses_teachers 表需要包含三个外键,分别关联到 studentscoursesteachers 表。

创建表结构

首先,我们需要创建前三张表:

代码语言:txt
复制
CREATE TABLE students (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(255) NOT NULL
);

CREATE TABLE courses (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(255) NOT NULL
);

CREATE TABLE teachers (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(255) NOT NULL
);

接下来,我们创建 student_courses_teachers 表,并添加三个外键:

代码语言:txt
复制
CREATE TABLE student_courses_teachers (
    student_id INT,
    course_id INT,
    teacher_id INT,
    PRIMARY KEY (student_id, course_id, teacher_id),
    FOREIGN KEY (student_id) REFERENCES students(id),
    FOREIGN KEY (course_id) REFERENCES courses(id),
    FOREIGN KEY (teacher_id) REFERENCES teachers(id)
);

解释

  1. 外键定义
    • FOREIGN KEY (student_id) REFERENCES students(id):表示 student_courses_teachers 表中的 student_id 字段是 students 表中 id 字段的外键。
    • FOREIGN KEY (course_id) REFERENCES courses(id):表示 student_courses_teachers 表中的 course_id 字段是 courses 表中 id 字段的外键。
    • FOREIGN KEY (teacher_id) REFERENCES teachers(id):表示 student_courses_teachers 表中的 teacher_id 字段是 teachers 表中 id 字段的外键。
  • 主键定义
    • PRIMARY KEY (student_id, course_id, teacher_id):表示 student_courses_teachers 表的主键是由 student_idcourse_idteacher_id 三个字段组成的复合主键。

应用场景

这种表结构常用于教育系统中,记录学生选课及对应的教师信息。例如:

  • students 表存储学生信息。
  • courses 表存储课程信息。
  • teachers 表存储教师信息。
  • student_courses_teachers 表记录每个学生选了哪些课程,以及这些课程由哪些教师教授。

可能遇到的问题及解决方法

  1. 外键约束冲突
    • 问题:插入数据时,如果引用的主表中没有对应的主键值,会报错。
    • 解决方法:确保插入数据前,引用的主表中已经存在对应的主键值。
  • 性能问题
    • 问题:外键约束会影响插入、更新和删除操作的性能。
    • 解决方法:在设计表结构时,合理规划外键的使用,避免过多的外键约束。必要时,可以考虑使用软删除(逻辑删除)来减少外键约束的影响。
  • 数据一致性
    • 问题:外键约束可以保证数据的一致性,但如果主表中的数据被删除,可能会导致外键表中的数据变得无效。
    • 解决方法:在设计表结构时,考虑使用级联删除(ON DELETE CASCADE)或设置外键约束为 ON DELETE SET NULLON DELETE SET DEFAULT,以确保数据的一致性。

参考链接

希望这些信息对你有所帮助!

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • MySQL外键有什么作用

    MySQL外键的作用: 保持数据一致性,完整性,主要目的是控制存储在外键表中的数据。使两张表形成关联,外键只能引用外表中列的值!...里面包含stu_id学号,course_id课程号,grade分数 example2表,里面包含id,stu_id学号,course_id课程号,然后建立外键 分别插入数据到两个表中。...我们把example2中的stu_id和course_id称为example2表的外键,example1是父表,example2是字表,两个表形成关联,必须字表的数据删除后,才能删除父表中的对应数据 现在我们来删除...stu_id=2; 这样就成功了; 事件触发限制: on delete和on update , 可设参数cascade(跟随外键改动), restrict(限制外表中的外键改动),set Null(设空值...我们先删除外键,然后重新建立外键带上事件触发限制 alter table example2 drop foreign key f_ck; alter table example2 add CONSTRAINT

    7.1K20

    mysql如何添加一个表的外键

    1:创建一个父表,主键作为子表的外键: 1 create table province( 2 pId int primary key auto_increment, 3 pName varchar...(20) 4 ); 2:创建子表,外键是父表的主键: 1 create table user( 2 userId int primary key auto_increment, 3 userName varchar...(40), 4 pid int, 5 foreign key(pid) references province(pId) 6 ); 给一张表添加外键,即给子表的外键添加主键的规则: 在子表声明一个字段pid...int,用于作为子表的外键,foreign key(子表的外键字段) references 父表的表名(父表的主键的字段名); 3:当创建好数据表时添加外键约束: alter table user add...foreign key(pid) references province(pId); alter table 子表的数据表名 add foreign key(子表的外键名称) references 父表的数据表名称

    6.6K70

    14.MySQL(二) 数据之表操作表内容操作Mysql 连接事务外键

    primary key; alter table 表名 modify 列名 int, drop primary key; 添加外键:alter table 从表 add constraint...外键名称(形如:FK_从表_主表) foreign key 从表(外键字段) references 主表(主键字段); 删除外键:alter table 表名 drop foreign key 外键名称...2、稳定性 : 有非法数据(外键约束之类),事务撤回。 3、隔离性:事务独立运行。一个事务处理后的结果,影响了其他事务,那么其他事务会撤回。事务的100%隔离,需要牺牲速度。...-->要写入的内容 rollback; -->回滚到原来状态 commit; -->确认提交 外键 MySQL支持外键的存储引擎只有InnoDB ,...在创建外键的时候 , 要求父表必须有对应的索引 , 子表在创建外键的时候也会自动创建对应的索引

    4.4K90

    第22问:我有带外键的表,你有数据么?

    问题 在实验 8 中,我们为表生成了测试数据。 有小伙伴问:如果两个表有外键关系,我们生成的随机数据没法满足外键关系,怎么办? 实验 先来建一个测试库: ? 建两张有外键关系的表: ?...先为 office 表灌入一些基础数据: ? 然后为 user 表灌入支持外键的数据: ? 来看一下我们生成的效果: ?...可以看到生成工具为 office1 和 office2 两个外键列都生成了符合外键规范的数据: ? 而外键数据的采样数量正是 100。 ?...小技巧 如果大家希望为不同的外键列,生成不同采样数量的数据,可以创建多张表,每张表分别配置一个外键列,最后将多张表合并为一张表。.../fix_max-fk-samples/mysql_random_data_load.fix.tar.gz 下载作者临时修复的 linux 版本。

    1.3K10

    MySql学习笔记(一)- 表类型有哪些,怎么用?

    天天在用mysql,你说sql有什么学的,但是面试官说你学的都是皮毛。怎么样?...读过我文章的朋友都知道我写的比较简洁,希望写博客的过程能够梳理自己的思维方式,也希望能够帮到别人,少走弯路。...所以说一张表就是一棵树,那么这个树的类型有哪些?这也就是我们标题所示的表类型。 那么具体的表类型有哪些?...mysql的基本表类型有MyISAM、InnoDB、DBD、MEMORY、MERGE、EXAMPLE、NDB CLUSTER、ARCHIVE、CSV、BLACKHOLE、FEDERATED等。...通过上图的对比,我们发现InnoDB其实是当下最好的表类型了。但是他的数据上限是64TB MyISAM mysisam不支持事务,也没有外键关系,他的优势是访问速度快。

    3.3K30

    mysql 小表A驱动大表B在内关联时候,怎么写sql?那么左关联呢?右关联有怎么写?

    一:mysql 小表A驱动大表B在内关联时候,怎么写sql在MySQL中,可以使用INNER JOIN语句来内关联两个表。如果要将小表A驱动大表B进行内关联,可以将小表A放在前面,大表B放在后面。...二:mysql 小表A驱动大表B在右关联时候,怎么写sql?左关联怎么写?在MySQL中,通过RIGHT JOIN(右连接)可以将小表A驱动大表B的连接操作。...通过RIGHT JOIN,将小表A作为驱动表,并通过指定的条件(例如id字段)与大表B进行连接。这将返回包括大表B的所有行以及与小表A匹配的行。...三:mysql执行sql顺序 是从左到右还是从右到左?在MySQL中,SQL语句的执行顺序是从上到下,从左到右的顺序。具体来说,MySQL首先会解析FROM子句,然后根据JOIN条件连接相关的表。...在连接完成后,MySQL会根据WHERE子句的条件进行筛选,仅返回符合条件的行。接下来,MySQL会执行SELECT语句,选择需要返回的列。最后,MySQL会根据ORDER BY子句对结果进行排序。

    1.2K10

    2020-01-20:mysql中,一张表里有3亿数据,未分表...

    2020-01-20:mysql中,一张表里有3亿数据,未分表,要求是在这个大表里添加一列数据。数据库不能停,并且还有增删改操作。请问如何操作?...针对 MySQL 5.6(不包含)之前的版本,通过触发器将一个表的更新在另一个表上重复,并进行数据同步,当数据同步完成时,业务上修改表名为新表并发布。业务不会暂停。...UPDATE"; Replace into 新表 SELECT * from 原有表 where 新表.id = 原有表.id; END IF; end; MySQL 5.6(包含) 以后的版本引入了在线...最好还是明确 ALGORITHM 以及 LOCK,这样执行 DDL 的时候能明确知道到底会对线上业务有多大影响。...*** 每日一面 - MySQL 大表添加一列 评论

    1.1K10

    MySQL实战第四十一讲- 怎么最快地复制一张表?

    我在上一篇文章最后,给你留下的问题是怎么在两张表中拷贝数据。如果可以控制对源表的扫描行数和加锁范围很小的话,我们简单地使用 insert … select 语句即可实现。...加上“local”,读取的是客户端的文件,只要 mysql 客户端有访问这个文件的权限即可。这时候,MySQL 客户端会先把本地文件传给服务端,然后执行上述的 load data 流程。...因为,一个 InnoDB 表,除了包含这两个物理文件外,还需要在数据字典中注册。直接拷贝这两个文件的话,因为数据字典中没有 db2.t 这个表,系统是不会识别和接受它们的。...至此,拷贝表数据的操作就完成了。这个流程的执行过程如下图3所示: 关于拷贝表的这个流程,有以下几个注意点: 1....但这个方法的缺点之一就是,每次只能导出一张表的数据,而且表结构也需要另外的语句单独备份。 后两种方式都是逻辑备份方式,是可以跨引擎使用的。 最后,我给你留下一个思考题吧。

    2.7K20

    MySQL数据库——表的约束(非空约束、唯一约束、主键约束、外键约束)

    UNIQUE ); 注意:MySQL中唯一约束限定的列的值可以有多个null 2)删除唯一约束: -- alter table stu modify number varchar(20); 不同于非空约束的删除方法...所以,基于以上问题,我们可以通过拆表解决,一张员工表,一张部门表,员工表中的dep_id 对应部门表中的id ?...外键,就是从表中与主表主键对应的那一列,如:员工表中的dep_id,其中,主表是一方,用来约束别人的表,从表可以是多方,被别人约束的表。 注意:外键可以为NULL,但是不能是不存在的外键值。 ?...employee (NAME, age, dep_id) VALUES ('小王', 18, 2); SELECT * FROM employee; SELECT * FROM department; 因为有外键的约束...; 3)在创建表后添加外键: ALTER TABLE 表名称 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称); -- 添加外键

    18.8K21

    分布式数据库中分布键该怎么选?一张表只有一次机会

    原因很简单:一张表只能有一个分布键,但业务查询的JOIN字段往往不止一种。...orders 表,三种查询模式,三个候选分布键。...分布键选择:一张表只有一次机会 正因为只能选一个,分布键的决策就必须严肃对待。改错了代价极高——轻则停服迁移,重则影响线上核心业务。...但还需要叠加以下三个约束来验证: 第三步:量化评分,辅助决策 当候选字段不止一个时,用这张评分表来对比: 综合得分 = Σ(权重 × 得分),超过 4 分的字段可以作为最终候选。...分布键选对了,核心查询的性能天花板能提升两个数量级;选错了,后续再怎么调 SQL 都是在有限的空间里打转。

    20010

    主键、外键和约束:让数据库“有规矩”才能不出错!|转行学DB第5天

    前几篇我们学会了建表、插数据、查数据。但有个问题一直让我头疼:我怎么保证同一张表里不会出现两条一模一样的学生记录?怎么保证订单表里的用户ID,在用户表里一定存在?怎么防止有人把年龄填成负数?...的数据会报错不能为空:不写id也会报错一张表只能有一个主键(但可以由多列组成,叫联合主键)小技巧:很多表会用id作为主键,然后设置AUTO_INCREMENT(自动递增),这样插入时不用自己写数字,数据库自动给...后面想删除一条,发现没法区分它们……后来才知道,每张表都应该有一个主键。三、外键:两张表之间的“锁链”外键是用来连接两张表的。...比如:学生表(主表):存放学生基本信息成绩表(从表):每个学生有多条成绩记录成绩表里需要记录“这个成绩属于哪个学生”,于是存学生表的id。这个student_id就是外键——它指向学生表的主键。...id关联,少用字符串六、今日学习心得今天的内容总结成三句话:主键=身份证,保证每一行独一无二外键=挂钩,保证两张表的数据能对得上约束=规矩,让数据从一开始就干净有了这些“家规”,数据库就不会收留“奇怪的数据

    36510

    六年开发经验,整理Mysql数据库技巧笔记,全网最详细的笔记集合!

    ; -- 查看表结构 desc 表名; -- 查看创建表的SQL语句,看到的是mysql生成的语句,并不是我们写的,功能是一样的。...WHERE 条件; 显式内连接 SELECT 列名 FROM 表名1 [INNER] JOIN 表名2 ON 条件; 外连接查询 左外连接 查询左表的全部数据,和左右两张表有交集部分的数据。...SELECT 列名 FROM 表名1 RIGHT [OUTER] JOIN 表名2 ON 条件; 子查询 将一条查询语句作为一张虚拟表 Mysql约束 主键约束 特点:主键约束默认包含非空和唯一两个功能...; 外键约束 建表时添加外键约束 CREATE TABLE 表名( 列名 数据类型 约束, ......KEY 外键名; 建表后单独添加外键约束 ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY (本表外键列名) REFERENCES 主表名(主键列名); 外键的级联更新和级联删除

    2.1K20

    MySQL 开发规范清单:建表、索引、SQL、ORM 四块一次讲透

    超长文本(如商品详情)拆出来单独一张表用主键关联,别硬塞在主表里拖垮索引率。...我把两条路的取舍画成一张表:维度物理删除逻辑删除数据可追溯不可恢复可追溯操作记录唯一性约束无冲突需处理唯一键复用存储占用省空间多占一行标记查询复杂度简单每处WHERE都带is_deleted适用场景临时表...此外两个"禁用"要记牢:外键与级联必须禁用,一切外键概念在应用层解决——外键影响插入速度,级联更新是强阻塞,分布式高并发场景更是更新风暴的温床;存储过程必须禁用,难以调试、难以扩展、没有移植性。...可能有人会问:禁用外键,那数据一致性谁来保证?应用层事务来保证。student表删了学生,删除score表关联记录的逻辑放在同一个事务里,由代码控制顺序。...单机低并发时外键省事,但上了分布式,外键的强阻塞就是性能杀手,所以规范宁可让应用层多写两行。还有一条运维铁律:数据订正(尤其删改)之前,必须先SELECT确认,再执行更新。

    5610
    领券