MySQL数据核心技术:理解主键与外键的关系与作用

在进行数据库设计时,合理的添加主键和外键能有效保障数据的完整性和一致性,使得数据管理更加科学高效。本文将详细介绍MySQL中主键和外键的基本概念、它们之间的关系、作用及一些高级知识点。
image.png

一、主键(Primary Key)的概念

主键是用于唯一标识表中每一行数据的字段或字段组合。在一个表中,主键要求具备以下特性:

  1. 唯一性:主键值必须唯一,确保表中每一行数据的唯一性。
  2. 非空性:主键字段不能为空,这是因为不能为空值用于唯一标识每一行数据。

例如,假设我们有一个名为“users”的表,其中“user_id”为主键,创建表的语法如下:

CREATE TABLE users (
    user_id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(100) NOT NULL,
    email VARCHAR(100) NOT NULL
) ENGINE=INNODB;

在该表中,“user_id”字段自动递增且只能包含唯一的非空值。

二、外键(Foreign Key)的概念

外键是一种数据库约束,用于在两张表之间建立关联,使得子表中某个字段或字段组合引用父表的主键或唯一键[ citation:2][ citation:4]。通过外键,能够确保数据的完整性和一致性。
基本语法如下:

[CONSTRAINT [symbol]] FOREIGN KEY
    [index_name] (col_name,...)
    REFERENCES tbl_name (col_name,...)
    [ON DELETE reference_option]
    [ON UPDATE reference_option]

例如,假如有一个订单表“orders”,希望每个订单都关联到一个用户,我们可以通过“user_id”将“orders”表与“users”表关联起来:

CREATE TABLE orders (
    order_id INT AUTO_INCREMENT PRIMARY KEY,
    order_date DATE,
    user_id INT,
    CONSTRAINT fk_user
    FOREIGN KEY (user_id)
    REFERENCES users(user_id)
    ON DELETE CASCADE
    ON UPDATE CASCADE
) ENGINE=INNODB;
三、主键与外键的关系及作用

主键和外键之间的主要关系和作用体现在以下几个方面:

  1. 唯一标识与数据参照:主键用于唯一标识表中的记录,而外键用于引用另一个表中的主键,建立表与表之间的关联关系。
  2. 保持数据完整性:通过主键和外键的设置,可以防止非法数据的插入和删除。例如,不能插入一个在父表中不存在的外键值,也不能删除在子表中被引用的父表记录。
  3. 实现参照完整性:通过外键定义的引用操作(如ON DELETE CASCADE、ON UPDATE CASCADE等),可以保证在父表数据更新或删除时,子表数据也会相应地更新或删除,从而保持数据的一致性。
四、外键在实际中的应用实例

下面通过一些实例来展示主键和外键在实际中的应用。

示例1:订单与客户关系(CASCADE操作)

假设有“customers”和“orders”两个表,创建它们并定义外键如下:

CREATE TABLE customers (
    customer_id INT PRIMARY KEY,
    name VARCHAR(100)
) ENGINE=INNODB;

CREATE TABLE orders (
    order_id INT AUTO_INCREMENT PRIMARY KEY,
    order_date DATE,
    customer_id INT,
    FOREIGN KEY (customer_id)
    REFERENCES customers(customer_id)
    ON DELETE CASCADE
    ON UPDATE CASCADE
) ENGINE=INNODB;

在这个关系中,如果删除一个客户记录,所有关联的订单记录也会一同被删除,保证数据的一致性。

示例2:设置NULL操作

另一个常见的操作是当父表记录被删除或更新时,将子表中的外键字段设置为NULL:

CREATE TABLE customers (
    customer_id INT PRIMARY KEY,
    name VARCHAR(100)
) ENGINE=INNODB;

CREATE TABLE orders (
    order_id INT AUTO_INCREMENT PRIMARY KEY,
    order_date DATE,
    customer_id INT,
    CONSTRAINT fk_customer
    FOREIGN KEY (customer_id)
    REFERENCES customers(customer_id)
    ON DELETE SET NULL
    ON UPDATE SET NULL
) ENGINE=INNODB;

在这个关系中,当父表中的客户记录被删除或更新时,子表“orders”中的对应外键字段“customer_id”将会被设置为NULL,而不是完全删除子表记录。这在某些业务场景中非常有用,比如保留订单记录但移除其与客户的关联。

五、组合主键与组合外键

除了单字段主键和外键,MySQL还支持组合主键和组合外键,即由多个字段共同构成的主键或外键。在一些特殊的数据库设计场景中,这种方式可以更好地描述数据间的复杂关系。

1. 组合主键

组合主键是由多个字段共同组成的主键,用于唯一标识表中的记录。例如,学生选课系统中,选课记录表“enrollments”可以由学生ID(student_id)和课程ID(course_id)共同组成主键:

CREATE TABLE enrollments (
    student_id INT,
    course_id INT,
    enrollment_date DATE,
    PRIMARY KEY (student_id, course_id)
) ENGINE=INNODB;

在这个表中,“student_id”和“course_id”的组合确保了每个学生在每门课程中的唯一记录。

2. 组合外键

类似地,组合外键是指多个字段组合起来共同指向另一个表的主键。例如,在上面的选课系统中,“enrollments”表的字段“student_id”和“course_id”可以一起作为外键指向“students”和“courses”表的主键:

CREATE TABLE students (
    student_id INT PRIMARY KEY,
    name VARCHAR(100)
) ENGINE=INNODB;

CREATE TABLE courses (
    course_id INT PRIMARY KEY,
    title VARCHAR(100)
) ENGINE=INNODB;

CREATE TABLE enrollments (
    student_id INT,
    course_id INT,
    enrollment_date DATE,
    PRIMARY KEY (student_id, course_id),
    FOREIGN KEY (student_id)
      REFERENCES students(student_id)
      ON DELETE CASCADE
      ON UPDATE CASCADE,
    FOREIGN KEY (course_id)
      REFERENCES courses(course_id)
      ON DELETE CASCADE
      ON UPDATE CASCADE
) ENGINE=INNODB;

在这个设计中,删除或更新“students”或“courses”表的记录时,相应的“enrollments”表记录也会同步删除或更新。

六、处理外键约束失败

由于外键约束的存在,有时在插入、更新或删除数据时会失败。常见的原因及处理方法包括:

  1. 违反参照完整性:插入子表记录时,外键引用的父表记录不存在。
    • 处理方法:确保父表中存在相应的主键记录,或先插入父表记录再插入子表记录。
  2. 违反唯一性约束:插入、更新数据时违反了主键唯一性约束。
    • 处理方法:确保每个主键值是唯一的,或者合理设计主键生成机制,如采用AUTO_INCREMENT。
  3. 无法删除父表记录:删除父表记录时,该记录被子表引用。
    • 处理方法:可以使用ON DELETE CASCADE 或 ON DELETE SET NULL 等策略,确保删除父表记录时对子表记录进行相应处理。

例如,以下查询创建一个临时禁用外键检查的方案,以进行批量数据插入、更新或删除操作:

SET FOREIGN_KEY_CHECKS = 0;

-- 执行相关插入、更新或删除操作

SET FOREIGN_KEY_CHECKS = 1;

需要注意,这种方式仅用于特殊场景,禁用外键检查会带来数据一致性风险,应谨慎使用。

七、总结一下

主键和外键是关系型数据库中确保数据完整性和一致性的关键元素。通过主键,我们能够唯一标识每一行记录,而通过外键,我们能够建立表与表之间的关联,确保数据的一致性。
在实际应用中,合理设计主键和外键能够提高数据库运行效率,增强数据管理的可靠性。同时,理解组合主键和组合外键的概念能帮助我们应对更加复杂的数据关系。
希望通过这篇文章,大家对MySQL中的主键与外键有了更加深入的理解。在后续的教程中,我们将会进一步探讨更多MySQL数据库的高级特性和技巧。感谢大家的阅读与支持!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/764653.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Bootstrap 缩略图

Bootstrap 缩略图 引言 Bootstrap 是一个流行的前端框架,它提供了一套丰富的组件和工具,帮助开发者快速构建响应式和移动优先的网页。缩略图(Thumbnails)是 Bootstrap 中的一种组件,用于展示图片或其他媒体内容,通常与标题和文本描述一起使用,形成一个整洁的布局。本文…

Flink实现准确和高效流处理的关键问题

时间相关: Watermark 水位线 水位线是插入到数据流中的一个标记,可以认为是一个特殊的数据。水位线主要的内容是一个时间戳,用来表示当前事件时间的进展。水位线是基于数据的时间戳生成的。水位线的时间戳必须单调递增,以确保任务的事件时间时钟一直向前推进,进展。水位线…

linux 离线安装docker

测试服务器:银河麒麟V10 x86_64 注意:推荐使用国内的镜像站下载,因为官网不挂梯子无法访问,我用的是清华大学开源软件镜像站 一、下载离线包: 官网下载docker离线包 下载地址:https://download.docker.c…

C# 计算椭圆上任意一点坐标

已知圆心坐标 (x0,y0),横轴 A(长半轴),竖轴 B(短半轴),角度 a,则圆边上点(x,y)的坐标为: 方法一 …

金蝶云星空字段之间连续触发值更新

文章目录 金蝶云星空字段之间连续触发值更新场景说明具体需求:解决方案 金蝶云星空字段之间连续触发值更新 场景说明 字段A配置了字段B的计算公式,字段B配置了自动C的计算公式,修改A的时候,触发了B的重算,但是C触发不…

BIOS设置与系统分区

📑打牌 : da pai ge的个人主页 🌤️个人专栏 : da pai ge的博客专栏 ☁️宝剑锋从磨砺出,梅花香自苦寒来 目录 一BIOS 1破解密码的前提 2B…

机器学习实战20-利用AnoSVGD算法探索多指标的异常检测的应用

大家好,我是微学AI,今天给大家介绍一下机器学习实战20-利用AnoSVGD算法探索多指标的异常检测的应用。SVGD(Stein Variational Gradient Descent)是一种通用的变分推断算法,它是优化中梯度下降的自然对应物。SVGD通过应用一种功能性梯度下降来…

游戏AI的创造思路-技术基础-tanh函数详解

又来搞事情,总想着把sigmoid函数替换成其他函数作为激活函数,或者找到更合适某一段训练的函数,所以今天来聊聊tanh函数(谁让咱当年差点去了数学系,结果还是在数学系转过去计算机的) 目录 3.9. tanh函数详解…

让采购和工程师们既爱又恨的任务——BOM

在项目研发与生产过程中,有一个常常让采购经理和工程师们既爱又恨的任务,那就是整理BBOMB。BOM作为连接设计与制造的桥梁,其重要性不言而喻,它详细列出了产品构成所需的所有零部件、材料及其规格、数量,是成本估算、采…

如何选择品牌推广公司?哪家好?收费标准及评价!

不管是什么品牌,推广对公司的成败起了很关键的作用。然而,面对市面上琳琅满目的品牌推广公司,如何选择一家既熟悉又靠谱的公司,成为许多企业主面临的难题。 作为一家手工酸奶品牌的创始人,目前全国也复制了100多家门店…

超简洁Django个人博客系统(适合初学者)

一、环境介绍 Django4.2.13Markdown3.3.4PyMySQL1.1.1Python3.8PyCharm 2023.1.2 (Professional Edition) 二、功能简介 用户登录 通过在pycharm终端执行以下命令创建超级管理员。python manage.py create createsuperuser 创建完成后再通过新建的超级管理员账号进行登录 …

Java的日期类常用方法

Java_Date 第一代日期类 获取当前时间 Date date new Date(); System.out.printf("当前时间" date); 格式化时间信息 SimpleDateFormat simpleDateFormat new SimpleDateFormat("yyyy-mm-dd hh:mm:ss E); System.out.printf("格式化后时间" si…

【Arduino】小飞鱼通达二开实验ESP32使用激光传感器(图文)

激光在我们的生活中应用很多,比如激光雷达、激光焊接、激光笔等等,今天我们来实验一下这个激光传感器模块。 这个模块的使用非常的简单,模块一共有3个针脚,正负极针脚和一个信号输入S针脚,当给到S针脚一个高电平时即可…

动手RAG: ocr调研

对于rag应用来说,文档是第一步,对于部分扫描件的文件来讲,主要就需要OCR. OCR tesseractppocrmmocr OCR包含几类, 自然场景中的文字识别,文档中的文字识别pipeline: 文本检测,文本识别,文…

武汉星起航:无锡跨境电商加速“出海”,物流升级助品牌全球布局

随着全球化的不断深入,跨境电商作为数字外贸的新业态,正逐渐成为无锡企业拓展海外市场的重要渠道。武汉星起航关注到,近年来,无锡市通过积极推进国际物流枢纽建设,完善海外仓布局,以及各特色产业带的积极参…

19184 传球游戏

这是一个经典的动态规划问题,我们可以定义一个二维数组dp[i][j],其中i表示传球的次数,j表示球当前在哪个同学手里。我们需要找到的是dp[m][1],即球传了m次后又回到1号同学手里的方法数。 我们可以从1次开始,逐次计算每…

老师怎样一键发布期末考试成绩?

期末考试的钟声一响,老师们便开始了紧张的阅卷工作。成绩出来后,他们又面临着一项繁琐的任务——将成绩单逐一私信给每位学生的家长。这不仅耗费了大量时间,也让老师们在繁忙的期末工作中倍感压力。期末老师的工作已经够多够繁琐,…

10款优秀的企业防泄密软件推荐 (干货必看)

在当今日益数字化的商业环境中,企业数据的安全性和保密性显得尤为重要。随着网络攻击和数据泄露事件的频发,越来越多的企业开始关注并投入资源于防泄密软件的使用。本文旨在为读者推荐10款优秀的企业防泄密软件,帮助企业在保护敏感信息方面做…

LabVIEW风机跑合监控系统

开发了一种基于LabVIEW的风机跑合监控系统,提高风机测试的效率和安全性。系统通过自动控制风机的启停、实时监控电流和功率数据,并具有过流保护功能,有效减少了人工操作和安全隐患,提升了工业设备测试的自动化和智能化水平。 项目…