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

数据库中的主键和外键分别是什么意思?

让我们来聊聊数据库设计中非常重要的两个概念——主键(Primary Key)和外键(Foreign Key)。这两个概念对于保证数据的一致性和完整性至关重要。

主键(Primary Key)

主键是一个表中的一个或一组字段,它的值是唯一的,并且不允许为NULL。主键用来唯一标识表中的每一行记录。一个表只能有一个主键,但是这个主键可以由多个字段组成,这样的主键称为复合主键。

示例代码:

CREATE TABLE Users (id INT AUTO_INCREMENT,username VARCHAR(50) NOT NULL,email VARCHAR(100) UNIQUE,PRIMARY KEY (id)
);

在这个例子中,id 是主键,用于唯一标识每个用户。虽然 email 字段也设为了唯一,但它不是主键,而只是一个约束以确保没有重复的电子邮件地址。

外键(Foreign Key)

外键是一个表中的一个或一组字段,它引用了另一个表的主键。外键的作用是将两张或多张表关联起来,确保了数据之间的一致性。

示例代码:

CREATE TABLE Orders (order_id INT AUTO_INCREMENT,user_id INT NOT NULL,order_date DATE,PRIMARY KEY (order_id),FOREIGN KEY (user_id) REFERENCES Users(id)
);

这里 Orders 表中的 user_id 是一个外键,它引用了 Users 表中的 id 字段。这确保了每一个订单都关联到了一个真实存在的用户上。

日常开发使用建议

  1. 选择合适的主键:

    • 在设计数据库时,应该选择一个能够长期保持唯一的字段作为主键。通常情况下,使用自动增长的整数类型(如MySQL中的INT AUTO_INCREMENT)是一个不错的选择。
    • 避免使用可能会变化的字段作为主键,例如用户的电子邮件地址。
  2. 合理使用外键:

    • 使用外键可以强制实施引用完整性,防止出现“孤儿”记录(即指向不存在记录的外键)。
    • 当删除一个主表中的记录时,需要考虑级联删除或者设置为null等操作。例如,ON DELETE CASCADE会自动删除所有相关联的外键记录。
  3. 性能与索引:

    • 在高并发读取的场景下,过多的外键可能会影响查询性能,因为它们会增加额外的约束检查。
    • 考虑到性能问题,适当的时候可以考虑使用索引而不是外键来优化查询速度。
  4. 注意数据一致性:

    • 在进行大批量数据操作时,比如批量插入、更新或删除,要特别小心,避免破坏外键关系导致数据不一致。
  5. 备份与恢复:

    • 在进行数据库结构变更前,特别是涉及到删除或修改外键约束时,一定要先备份数据。
    • 恢复数据时,先恢复主表的数据,再恢复依赖于这些主表的其他表的数据,以维持数据一致性。

以上就是在实际开发过程中关于主键和外键的一些基本知识和注意事项。希望对你有所帮助!

相关文章:

数据库中的主键和外键分别是什么意思?

让我们来聊聊数据库设计中非常重要的两个概念——主键(Primary Key)和外键(Foreign Key)。这两个概念对于保证数据的一致性和完整性至关重要。 主键(Primary Key) 主键是一个表中的一个或一组字段&#x…...

HTML5中`<ul>`标签深入全面解析

在HTML5的广阔天地里&#xff0c;<ul>标签作为无序列表的代言人&#xff0c;扮演着举足轻重的角色。它不仅能够整洁地罗列信息&#xff0c;还通过丰富的属性和样式选项&#xff0c;为网页设计师提供了无限的创意空间。本文将深入剖析<ul>标签的内核&#xff0c;详细…...

MongoDB日志级别

日志 查看当前的日志级别 根据你提供的 MongoDB 命令结果&#xff0c;命令 db.adminCommand({ getParameter: "logComponentVerbosity" }) 返回了 "ok" : 0&#xff0c;这意味着命令执行失败&#xff0c;没有成功获取到日志级别的配置信息。错误信息 &quo…...

Softmax回归--分类--有监督

输出和类别的维度一样。 一、当我们想将先线性层的输出直接视为概率&#xff0c;存在一些问题&#xff1a; 1.不能限制输出数字总和为1。 2.不能保证都是正数。 所以会使用softmax进行归一化。 二、交叉熵损失 交叉熵是一个衡量两个概率分布之间差异的很好的度量&#xff0…...

Jenkins生成html报告

下载插件 1.需要下载插件 html Publisher plugins 2.下载Groovy(设置css样式&#xff09;&#xff0c;默认没有css样式 在Job配置页面&#xff0c;增加构建步骤Execute system Groovy script&#xff0c;在Groovy Command中输入上面命令&#xff0c;即可&#xff1a; System.…...

牛客——查找字符串

B-你好&#xff0c;这里是牛客竞赛_牛客周赛 Round 59 (nowcoder.com) 返回值是子串或字符在 string 对象字符串中的位置 #include <bits/stdc.h> using namespace std; int T; string s; int main() { cin >> T; while(T --) { cin >>…...

感恩 各位老师们!和滋养你的人在一起,确实很重要——早读(逆天打工人爬取热门微信文章解读)

感恩 各位老师们 引言Python 代码第一篇 洞见 和滋养你的人在一起&#xff0c;确实很重要第二篇 一天 风云突变结尾 &#xff08;不是 现在网上在呢么各种图都有 哈哈哈&#xff09; 引言 今天是什么特殊的日子吗&#xff1f; 没错 教师节 说起这个教师节 我觉得大家更要记住…...

StorageSync数据缓存API

uni.setStorageSyncs参数:将 data 存储在本地缓存中指定的 key 中&#xff0c;会覆盖掉原来该 key 对应的内容&#xff0c;这是一个同步接口。 uni.setStorageSync函数里面写两个参数,分别是key和值,两个参数名称可以随便取,如果有同名的key,那么后面key的值会覆盖掉前面key的值…...

Guitar Pro 8.2.1 Build 32 永久中文破解解锁版

嗨&#xff0c;亲爱的吉他英雄们和音乐爱好者们&#xff01; 今天&#xff0c;我要向你们安利一个让无数音乐人疯狂打Call的神奇软件——Guitar Pro 8.2&#xff01;它不仅仅是个普通的乐谱编辑器&#xff0c;更是你音乐创作路上的超级助手。 软件介绍 Guitar Pro 8永久解锁版…...

视频编辑SDK解决方案,助力企业快速部署上线

美摄科技&#xff0c;作为移动视频编辑技术的领航者&#xff0c;凭借其强大的移动端视频编辑SDK解决方案&#xff0c;正以前所未有的姿态&#xff0c;重新定义视频创作的边界&#xff0c;赋能万千用户与企业&#xff0c;共创视觉盛宴。 打破平台壁垒&#xff0c;实现无缝衔接 …...

想要从OPPO手机恢复数据?免费OPPO照片视频恢复软件

此实用程序可帮助那些寻找以下内容的用户&#xff1a; 在OPPO手机中格式化存储卡后可以恢复图片吗&#xff1f;我删除了 OPPO上的视频和图片&#xff0c;我感觉很糟糕&#xff0c;因为里面有我在拉斯维加斯拍摄的视频和照片 免费OPPO照片视频恢复软件 您能恢复OPPO上已删除的…...

Linux 自主 shell 编写(C 语言实现)

Linux 自主 shell 编写&#xff08;C 语言实现&#xff09; 效果主要步骤打印命令行提示符获取用户命令字符串切割用户命令字符串执行命令循环 至此源码&#xff08;简易半成品&#xff09;细节内建命令问题cd 退出码问题echo 查看退出码 完整源码makefilemyshell.c 效果 效果…...

pointpillar部署-TensorRT实现(一)

1. 主干部分 核心部分分为:PreProcessCuda前处理; TRT(ppOnnxPath, stream_)模型推理; PostProcessCuda(stream_)后处理 内存管理部分: cudaMallocManaged 统一内存管理,无须进行cpu内存申请,gpu内存申请,cpu到gpu的数据拷贝过程。cudaMallocManaged 即可完成同一个变量…...

ubuntu使用命令行查看硬件信息

ubuntu使用命令行查看硬件信息 CPU cat /proc/cpuinfo其中&#xff0c;model name就显示了cpu的型号&#xff0c;cpu cores显示cpu的所有物理核心数量。 内存 cat /proc/meminfo其中&#xff0c;MemTotal就显示总内存大小&#xff0c;这里为32GB内存&#xff0c;SwapTotal显…...

vue国际化vue-i18n搭配i18n-ally实现多语言国际化

i18n-ally 是一款 VS Code 插件&#xff0c;为开发者提供了一套强大而简便的工具&#xff0c;以轻松实现国际化&#xff08;i18n&#xff09;。本文将介绍如何使用 i18n-ally 插件&#xff0c;实现应用程序的多语言支持。 一:安装vscode插件。 首先&#xff0c;在 Visual Stu…...

Linux(1)--Linux简介

文章目录 1. 基本概念2. 版本2.1 RedHat红帽2.2 CentOS2.3 Ubuntu2.4 Debian2.5 Kali Linux 3. Linux应用场景 1. 基本概念 Linux&#xff0c;全称GNU/LInux&#xff0c;本质上是一个类UNIX系统。 普通用户使用Linux的比较少&#xff0c;大家普遍比较熟悉微软公司的Windows和…...

Python——破解rar压缩包密码

破解RAR压缩包密码一般是通过穷举法来实现的&#xff0c;即尝试所有可能的密码组合&#xff0c;直到找到正确的密码为止。 以下是使用Python编写的一个简单的RAR密码破解程序&#xff1a; import itertools import rarfiledef crack_rar_password(rar_file, password_length)…...

取指操作流程

取指操作&#xff0c;即指令获取&#xff08;Instruction Fetch&#xff09;&#xff0c;是计算机执行程序时的一个基本且至关重要的步骤。这一过程虽然是自动进行的&#xff0c;但控制器的参与是不可或缺的&#xff0c;尽管它不需要针对每次取指操作接收一个明确的“取指”指令…...

Git:远程项目代码上传管理

本地代码上传至远端仓库&#xff0c;需要下载git&#xff0c;访问官网下载https://git-scm.com/downloads 一、初始化本地仓库 首先要在项目本地&#xff0c;打开Git Bash&#xff0c;输入以下代码&#xff01; git init 然后进行全局设置用户名和邮箱&#xff0c;使用以下代码…...

MySQL数据库的介绍

目录 1.什么是MySQL数据库 2.MySQL数据库的设计 MySQL的进一步认识 MySQL的客户端 —— mysql MySQL的服务端 —— mysqld 3.MySQL数据库的架构 MySQL架构图 连接层 服务层 存储引擎层 文件系统层 4.MySQL的存储引擎 认识存储引擎 MySQL中的存储引擎 存储引擎之…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

剑指offer20_链表中环的入口节点

链表中环的入口节点 给定一个链表&#xff0c;若其中包含环&#xff0c;则输出环的入口节点。 若其中不包含环&#xff0c;则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...

基于Springboot+Vue的办公管理系统

角色&#xff1a; 管理员、员工 技术&#xff1a; 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能&#xff1a; 该办公管理系统是一个综合性的企业内部管理平台&#xff0c;旨在提升企业运营效率和员工管理水…...

解读《网络安全法》最新修订,把握网络安全新趋势

《网络安全法》自2017年施行以来&#xff0c;在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂&#xff0c;网络攻击、数据泄露等事件频发&#xff0c;现行法律已难以完全适应新的风险挑战。 2025年3月28日&#xff0c;国家网信办会同相关部门起草了《网络安全…...

破解路内监管盲区:免布线低位视频桩重塑停车管理新标准

城市路内停车管理常因行道树遮挡、高位设备盲区等问题&#xff0c;导致车牌识别率低、逃费率高&#xff0c;传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法&#xff0c;正成为破局关键。该设备安装于车位侧方0.5-0.7米高度&#xff0c;直接规避树枝遮…...

实战设计模式之模板方法模式

概述 模板方法模式定义了一个操作中的算法骨架&#xff0c;并将某些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的前提下&#xff0c;重新定义算法中的某些步骤。简单来说&#xff0c;就是在一个方法中定义了要执行的步骤顺序或算法框架&#xff0c;但允许子类…...