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

OpenTenBase的外键(Foreign Key)和外键级联

外键(Foreign Key)

  • 作用:外键是用来在两个表之间建立连接的一种约束。它指向另一个表的主键,确保数据之间的引用完整性。其目的是为了杜绝孤儿记录(例如:一条选课记录指向一个不存在的学生ID)

  • 语法格式:

-- 1.列级约束(直接写在字段后面)CREATETABLE子表名(列名 数据类型REFERENCES父表名(父表列),其他列...);-- 2. 表级约束(写在所有字段后面)CREATETABLE子表名(列名1数据类型,列名2数据类型,FOREIGNKEY(子表列名)REFERENCES父表名(父表列名));-- 3. 自定义约束名sqlCREATETABLE子表名(列名1数据类型,列名2数据类型,CONSTRAINT约束名FOREIGNKEY(子表列名)REFERENCES父表名(父表列名)
  • 举个例子(父表为学生表,子表为选课表)

    • 列级约束(直接写在字段后面)
    -- 父表:学生表CREATETABLEstudent(student_id BIGSERIALPRIMARYKEY,student_noVARCHAR(20)UNIQUE,student_nameVARCHAR(50)NOTNULL);-- 子表:选课表(列级外键约束)CREATETABLEenrollment(enrollment_id BIGSERIALPRIMARYKEY,student_idBIGINTNOTNULLREFERENCESstudent(student_id),-- 列级外键section_idBIGINTNOTNULL,scoreNUMERIC(5,2));
    • 表级约束(写在所有字段后面)
    -- 子表:选课表(表级外键约束)CREATETABLEenrollment(enrollment_id BIGSERIALPRIMARYKEY,student_idBIGINTNOTNULL,section_idBIGINTNOTNULL,scoreNUMERIC(5,2),FOREIGNKEY(student_id)REFERENCESstudent(student_id)-- 表级外键);
    • 自定义约束名(表级 + CONSTRAINT)
    -子表:选课表(自定义约束名)CREATETABLEenrollment(enrollment_id BIGSERIALPRIMARYKEY,student_idBIGINTNOTNULL,section_idBIGINTNOTNULL,scoreNUMERIC(5,2),CONSTRAINTfk_enrollment_studentFOREIGNKEY(student_id)REFERENCESstudent(student_id)-- 自定义名称);

    外键REFERENCES student(student_id),其核心作用是:确保enrollment表中的每条选课记录,都必须对应一个在student表中真实存在的学生。简单来说:不能给不存在的学生记录选课成绩。


外键级联

  • 作用:当父表(被引用表)的数据发生删除更新时,子表(包含外键的表)中的数据可以自动执行相应的操作

  • 级联的两种类型:

  • ON DELETE(删除时的级联)

    选项行为学生表示例
    CASCADE删父表,自动删子表删除张三 → 自动删除张三的所有选课成绩
    SET NULL删父表,子表外键变NULL删除李四 → 李四的选课记录还在,但student_id变成NULL
    SET DEFAULT删父表,子表外键变默认值删除王五 → 王五的选课记录student_id变成0
    RESTRICT有子表引用就禁止删除(默认)赵六有选课成绩 → 不让删赵六
    NO ACTION同RESTRICT同上
  • ON UPDATE(更新时的级联)

    选项行为学生表示例
    CASCADE改父表主键,自动改子表外键学生ID从1改成100 → 选课表中的student_id也自动从1变成100
    RESTRICT有子表引用就禁止更新(默认)赵六有选课成绩 → 不让改赵六的ID
  • 举个例子:

-- 父表:学生表CREATETABLEstudent(student_id BIGSERIALPRIMARYKEY,student_noVARCHAR(20)UNIQUE,student_nameVARCHAR(50)NOTNULL);-- 1. ON DELETE CASCADE(级联删除)-- 作用:删除学生时,自动删除该学生的所有选课记录-- 业务场景:学生退学,成绩也不需要保留了CREATETABLEenrollment_cascade(enrollment_id BIGSERIALPRIMARYKEY,student_idBIGINTNOTNULL,section_idBIGINTNOTNULL,scoreNUMERIC(5,2),FOREIGNKEY(student_id)REFERENCESstudent(student_id)ONDELETECASCADE);-- 2. ON DELETE SET NULL(设为空值)-- 作用:删除学生时,保留选课记录,但 student_id 变为 NULL-- 业务场景:学生毕业后匿名化,保留成绩用于统计分析-- 注意:student_id 字段不能有 NOT NULL 约束CREATETABLEenrollment_set_null(enrollment_id BIGSERIALPRIMARYKEY,student_idBIGINT,-- 必须允许 NULLsection_idBIGINTNOTNULL,scoreNUMERIC(5,2),FOREIGNKEY(student_id)REFERENCESstudent(student_id)ONDELETESETNULL);-- 3. ON DELETE SET DEFAULT(设为默认值)-- 作用:删除学生时,保留选课记录,但 student_id 变为默认值(0)-- 业务场景:需要占位符,不能为 NULL,且能关联到"已删除学生"记录-- 前提:必须存在 student_id=0 的记录,且字段有 DEFAULT 0CREATETABLEenrollment_set_default(enrollment_id BIGSERIALPRIMARYKEY,student_idBIGINTDEFAULT0,-- 设置默认值section_idBIGINTNOTNULL,scoreNUMERIC(5,2),FOREIGNKEY(student_id)REFERENCESstudent(student_id)ONDELETESETDEFAULT);-- 4. ON DELETE RESTRICT(限制删除,默认行为)-- 作用:如果学生有选课记录,禁止删除该学生-- 业务场景:保护重要数据,防止误删有成绩的学生CREATETABLEenrollment_restrict(enrollment_id BIGSERIALPRIMARYKEY,student_idBIGINTNOTNULL,section_idBIGINTNOTNULL,scoreNUMERIC(5,2),FOREIGNKEY(student_id)REFERENCESstudent(student_id)ONDELETERESTRICT);-- 5. ON UPDATE CASCADE(级联更新)-- 作用:更新学生的 student_id 时,自动更新选课表中的 student_id-- 业务场景:学生ID需要重新编号时,自动同步所有关联表CREATETABLEenrollment_update(enrollment_id BIGSERIALPRIMARYKEY,student_idBIGINTNOTNULL,section_idBIGINTNOTNULL,scoreNUMERIC(5,2),FOREIGNKEY(student_id)REFERENCESstudent(student_id)ONUPDATECASCADE);
http://www.jsqmd.com/news/900127/

相关文章:

  • 一台手机想过 GMS 认证有多难?CTS、GTS、VTS 全流程实战指南(附踩坑血泪史)
  • AI应用的安全工程:从威胁建模到防护
  • ARM处理器调试架构:EDBGRQ与CTI对比与实现
  • STM32HAL库-UID实战:从读取到应用加密与设备标识
  • 智谱GLM-5:实用主义AGI的技术革命
  • 2026最新 | 零Prompt自动生成电商带货视频,这个AI工作台把出片门槛打成了地板
  • 5G毫米波MIMO波束对齐技术解析与优化方案
  • 编程语言“颜色”难题:异步与同步困境,Go语言如何破局?
  • 企业级 AI Agent: MCP、CLI、Skills,如何定位、该怎么选、最佳实践。
  • 2026年实力之选:东莞刻字膜与烫金纸生产厂家综合解析 - 品牌企业推荐师(官方)
  • 构建有记忆的AI支持代理:基于会话状态追踪与动态升级的工程实践
  • ChatGPT高效入门指南:3天建立认知框架、7天掌握结构化提示、30天构建个人AI工作流
  • 2026年 宝钢冷镦钢盘条/圆钢全牌号推荐榜单:源头厂家技术实力与行业优选深度解析 - 品牌企业推荐师(官方)
  • 手把手教你用Python爬虫+数据分析,量化验证‘蜘蛛一年吃掉的昆虫比英国人还重’这个惊人结论
  • SpringBoot与前端框架(Vue/React)联调实战指南
  • WPF TemplateBinding
  • 846378
  • C64 BASIC 游戏地图“相机视角”实现:从初稿到优化,性能提升有妙招!
  • 从零到一:QtCharts模块的集成与实战入门
  • 2026现阶段昆明婚宴礼服租赁:如何挑选性价比之王?金喜礼服馆深度解析 - 2026年企业资讯
  • RTA-OS中断实战:从概念到高效配置的嵌入式系统响应之道
  • 基于Amazon Bedrock构建AI智能体:从提示词工程到工具调用的实践指南
  • 深圳周边Inconel 718现货哪里找?揭秘珠三角核心供应商的快速响应能力 - 品牌2025
  • 2026年 宝钢镀锌HC550/980DHD+Z吉帕钢推荐榜单:超高强汽车用钢/先进高强钢/轻量化镀锌板/吉帕级冲压用钢厂家实力解析 - 品牌企业推荐师(官方)
  • 大模型智能系统落地应用与场景实战指南
  • 【Redis实战篇】缓存-穿透/雪崩/击穿问题的解决方案
  • java复习笔记(2)
  • Cadence Virtuoso IC617:从零开始的工程创建与库管理实战
  • 实战指南:基于ELK构建企业级业务日志实时监控与可视化分析系统
  • 论文降AI还在手动试错?2026实测10款热门工具(附优缺点全盘点)