当前位置: 首页 > news >正文

写一个简单的demo来理解数据库外键

  1. 准备工作
    安装MySQL
    确保已安装MySQL,并启动服务。可以通过命令行或工具(如MySQL Workbench)操作。

创建数据库

sql
复制
CREATE DATABASE school;
USE school;
  1. 创建父表和子表
    步骤 1:创建父表(students)
sql
复制
-- 父表:学生表(主键为 student_id)
CREATE TABLE students (
    student_id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50) NOT NULL,
    email VARCHAR(100) UNIQUE
) ENGINE=InnoDB;  -- 必须使用 InnoDB 引擎

步骤 2:创建子表(courses)并添加外键

sql
复制
-- 子表:课程表(外键关联学生表的 student_id)
CREATE TABLE courses (
    course_id INT PRIMARY KEY AUTO_INCREMENT,
    course_name VARCHAR(50) NOT NULL,
    student_id INT,  -- 外键字段
    CONSTRAINT fk_student  -- 外键约束名称
        FOREIGN KEY (student_id) 
        REFERENCES students(student_id)  -- 关联父表的主键
        ON DELETE CASCADE  -- 级联删除
        ON UPDATE CASCADE  -- 级联更新
) ENGINE=InnoDB;

关键点解释:

ON DELETE CASCADE:当父表(students)中的某条记录被删除时,子表(courses)中关联的记录会自动删除。

ON UPDATE CASCADE:当父表的主键(student_id)更新时,子表的外键字段同步更新。

  1. 插入数据并测试外键约束
    步骤 1:向父表插入数据
sql
复制
INSERT INTO students (name, email) 
VALUES 
    ('Alice', 'alice@example.com'),
    ('Bob', 'bob@example.com');

步骤 2:向子表插入合法数据(外键存在)

sql
复制
-- 合法操作:student_id=1 存在于 students 表
INSERT INTO courses (course_name, student_id) 
VALUES ('Math', 1);

步骤 3:尝试插入非法数据(外键不存在)

sql
复制
-- 非法操作:student_id=3 不存在于 students 表
INSERT INTO courses (course_name, student_id) 
VALUES ('Physics', 3);

结果:MySQL 会抛出错误:
Cannot add or update a child row: a foreign key constraint fails

  1. 测试级联操作
    场景 1:删除父表数据
sql
复制
-- 删除 Alice(student_id=1)
DELETE FROM students WHERE student_id = 1;

– 查看 courses 表
SELECT * FROM courses;
结果:
所有 student_id=1 的课程记录会被自动删除(级联删除)。

场景 2:更新父表主键

sql
复制
-- 将 Bob(student_id=2)的 ID 更新为 100
UPDATE students SET student_id = 100 WHERE student_id = 2;

– 查看 courses 表
SELECT * FROM courses;
结果:
子表中 student_id=2 的记录会被自动更新为 student_id=100(级联更新)。

  1. 修改外键约束
    添加新外键(如课程表关联教师表)
sql
复制
-- 先创建教师表(父表)
CREATE TABLE teachers (
    teacher_id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50)
) ENGINE=InnoDB;

-- 修改课程表,添加 teacher_id 外键
ALTER TABLE courses 
ADD COLUMN teacher_id INT,
ADD CONSTRAINT fk_teacher 
    FOREIGN KEY (teacher_id) 
    REFERENCES teachers(teacher_id);

删除外键

sql
复制
ALTER TABLE courses DROP FOREIGN KEY fk_teacher;
  1. 常见问题与排查
    问题 1:无法创建外键
    可能原因:

父表的主键字段与外键字段类型或长度不匹配。

父表未使用 InnoDB 引擎。

父表中不存在外键引用的数据。

问题 2:级联操作未生效
检查点:

确认外键定义时指定了 ON DELETE CASCADE 或 ON UPDATE CASCADE。

确保操作的是父表的主键字段。

  1. 总结
    通过这个示例,你学会了:

外键的创建与删除

级联操作的实际效果

外键约束的验证与错误处理

关键设计原则:

外键字段必须引用父表的唯一键(通常是主键)。

级联操作需谨慎使用,避免误删数据。

高频写入场景中,外键可能影响性能,需权衡利弊。

下一步练习
设计多对多关系
创建一个 student_course 中间表,关联学生和课程(需两个外键)。

测试 SET NULL 和 RESTRICT 约束
修改外键的 ON DELETE 行为,观察结果差异。

通过 ORM 操作外键
尝试在 Django 或 Flask-SQLAlchemy 中实现类似模型。

http://www.dtcms.com/a/123014.html

相关文章:

  • Java中的参数是值传递还是引用传递?
  • webpack配置导致浏览器自动刷新
  • Pytest+Allure+Excel接口自动化测试框架实战
  • 【Kafka基础】监控与维护:分区健康检查,确保数据高可用
  • 【C++算法】53.链表_重排链表
  • 数据可视化 —— 柱形图应用(大全)
  • 《Uniapp-Vue 3-TS 实战开发》构建HTTP请求拦截器
  • Windows 2016 如何关闭自动更新
  • HLSL Complex Shapes With For Loops
  • Linux启动端口,Windows 看是否通
  • 使用 Vue + PDF.js 构建在线 PDF 阅读器(支持目录与缩放)
  • Petalinux最简开发
  • (2)网络学习之堡垒机
  • 如何避免Python爬虫重复抓取相同页面?
  • 【数据结构】树状数组
  • RTT中断管理学习
  • 苹果电脑MAC系统安装
  • 【MySQL篇】mysqlpump和mysqldump参数区别总汇
  • 【C++游戏引擎开发】第11篇:GLFW、GLAD环境搭建与第一个三角形渲染
  • 09-Spring 与线程安全:IOC 与多线程下的坑与解法
  • 解锁Midjourney创作潜能:超详细提示词(Prompts)分类指南
  • 【42期获取股票数据API接口】如何用Python、Java等五种主流语言实例演示获取股票行情api接口之沪深指数最新分时BOLL数据及接口API说明文档
  • 三、使用Keil5新建STM32工程
  • 【学Rust写CAD】29 Alpha256结构体(alpha256.rs)
  • torch.meshgrid()
  • 【OCR】总结目前流行的主要的OCR工具
  • Jenkins安装流程
  • 联邦学习研读笔记
  • printf
  • 【NLP 面经 9、逐层分解Transformer】