数据库中的主键和外键分别是什么意思?
让我们来聊聊数据库设计中非常重要的两个概念——主键(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 字段。这确保了每一个订单都关联到了一个真实存在的用户上。
日常开发使用建议
-
选择合适的主键:
- 在设计数据库时,应该选择一个能够长期保持唯一的字段作为主键。通常情况下,使用自动增长的整数类型(如MySQL中的
INT AUTO_INCREMENT)是一个不错的选择。 - 避免使用可能会变化的字段作为主键,例如用户的电子邮件地址。
- 在设计数据库时,应该选择一个能够长期保持唯一的字段作为主键。通常情况下,使用自动增长的整数类型(如MySQL中的
-
合理使用外键:
- 使用外键可以强制实施引用完整性,防止出现“孤儿”记录(即指向不存在记录的外键)。
- 当删除一个主表中的记录时,需要考虑级联删除或者设置为null等操作。例如,
ON DELETE CASCADE会自动删除所有相关联的外键记录。
-
性能与索引:
- 在高并发读取的场景下,过多的外键可能会影响查询性能,因为它们会增加额外的约束检查。
- 考虑到性能问题,适当的时候可以考虑使用索引而不是外键来优化查询速度。
-
注意数据一致性:
- 在进行大批量数据操作时,比如批量插入、更新或删除,要特别小心,避免破坏外键关系导致数据不一致。
-
备份与恢复:
- 在进行数据库结构变更前,特别是涉及到删除或修改外键约束时,一定要先备份数据。
- 恢复数据时,先恢复主表的数据,再恢复依赖于这些主表的其他表的数据,以维持数据一致性。
以上就是在实际开发过程中关于主键和外键的一些基本知识和注意事项。希望对你有所帮助!
相关文章:
数据库中的主键和外键分别是什么意思?
让我们来聊聊数据库设计中非常重要的两个概念——主键(Primary Key)和外键(Foreign Key)。这两个概念对于保证数据的一致性和完整性至关重要。 主键(Primary Key) 主键是一个表中的一个或一组字段&#x…...
HTML5中`<ul>`标签深入全面解析
在HTML5的广阔天地里,<ul>标签作为无序列表的代言人,扮演着举足轻重的角色。它不仅能够整洁地罗列信息,还通过丰富的属性和样式选项,为网页设计师提供了无限的创意空间。本文将深入剖析<ul>标签的内核,详细…...
MongoDB日志级别
日志 查看当前的日志级别 根据你提供的 MongoDB 命令结果,命令 db.adminCommand({ getParameter: "logComponentVerbosity" }) 返回了 "ok" : 0,这意味着命令执行失败,没有成功获取到日志级别的配置信息。错误信息 &quo…...
Softmax回归--分类--有监督
输出和类别的维度一样。 一、当我们想将先线性层的输出直接视为概率,存在一些问题: 1.不能限制输出数字总和为1。 2.不能保证都是正数。 所以会使用softmax进行归一化。 二、交叉熵损失 交叉熵是一个衡量两个概率分布之间差异的很好的度量࿰…...
Jenkins生成html报告
下载插件 1.需要下载插件 html Publisher plugins 2.下载Groovy(设置css样式),默认没有css样式 在Job配置页面,增加构建步骤Execute system Groovy script,在Groovy Command中输入上面命令,即可: System.…...
牛客——查找字符串
B-你好,这里是牛客竞赛_牛客周赛 Round 59 (nowcoder.com) 返回值是子串或字符在 string 对象字符串中的位置 #include <bits/stdc.h> using namespace std; int T; string s; int main() { cin >> T; while(T --) { cin >>…...
感恩 各位老师们!和滋养你的人在一起,确实很重要——早读(逆天打工人爬取热门微信文章解读)
感恩 各位老师们 引言Python 代码第一篇 洞见 和滋养你的人在一起,确实很重要第二篇 一天 风云突变结尾 (不是 现在网上在呢么各种图都有 哈哈哈) 引言 今天是什么特殊的日子吗? 没错 教师节 说起这个教师节 我觉得大家更要记住…...
StorageSync数据缓存API
uni.setStorageSyncs参数:将 data 存储在本地缓存中指定的 key 中,会覆盖掉原来该 key 对应的内容,这是一个同步接口。 uni.setStorageSync函数里面写两个参数,分别是key和值,两个参数名称可以随便取,如果有同名的key,那么后面key的值会覆盖掉前面key的值…...
Guitar Pro 8.2.1 Build 32 永久中文破解解锁版
嗨,亲爱的吉他英雄们和音乐爱好者们! 今天,我要向你们安利一个让无数音乐人疯狂打Call的神奇软件——Guitar Pro 8.2!它不仅仅是个普通的乐谱编辑器,更是你音乐创作路上的超级助手。 软件介绍 Guitar Pro 8永久解锁版…...
视频编辑SDK解决方案,助力企业快速部署上线
美摄科技,作为移动视频编辑技术的领航者,凭借其强大的移动端视频编辑SDK解决方案,正以前所未有的姿态,重新定义视频创作的边界,赋能万千用户与企业,共创视觉盛宴。 打破平台壁垒,实现无缝衔接 …...
想要从OPPO手机恢复数据?免费OPPO照片视频恢复软件
此实用程序可帮助那些寻找以下内容的用户: 在OPPO手机中格式化存储卡后可以恢复图片吗?我删除了 OPPO上的视频和图片,我感觉很糟糕,因为里面有我在拉斯维加斯拍摄的视频和照片 免费OPPO照片视频恢复软件 您能恢复OPPO上已删除的…...
Linux 自主 shell 编写(C 语言实现)
Linux 自主 shell 编写(C 语言实现) 效果主要步骤打印命令行提示符获取用户命令字符串切割用户命令字符串执行命令循环 至此源码(简易半成品)细节内建命令问题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其中,model name就显示了cpu的型号,cpu cores显示cpu的所有物理核心数量。 内存 cat /proc/meminfo其中,MemTotal就显示总内存大小,这里为32GB内存,SwapTotal显…...
vue国际化vue-i18n搭配i18n-ally实现多语言国际化
i18n-ally 是一款 VS Code 插件,为开发者提供了一套强大而简便的工具,以轻松实现国际化(i18n)。本文将介绍如何使用 i18n-ally 插件,实现应用程序的多语言支持。 一:安装vscode插件。 首先,在 Visual Stu…...
Linux(1)--Linux简介
文章目录 1. 基本概念2. 版本2.1 RedHat红帽2.2 CentOS2.3 Ubuntu2.4 Debian2.5 Kali Linux 3. Linux应用场景 1. 基本概念 Linux,全称GNU/LInux,本质上是一个类UNIX系统。 普通用户使用Linux的比较少,大家普遍比较熟悉微软公司的Windows和…...
Python——破解rar压缩包密码
破解RAR压缩包密码一般是通过穷举法来实现的,即尝试所有可能的密码组合,直到找到正确的密码为止。 以下是使用Python编写的一个简单的RAR密码破解程序: import itertools import rarfiledef crack_rar_password(rar_file, password_length)…...
取指操作流程
取指操作,即指令获取(Instruction Fetch),是计算机执行程序时的一个基本且至关重要的步骤。这一过程虽然是自动进行的,但控制器的参与是不可或缺的,尽管它不需要针对每次取指操作接收一个明确的“取指”指令…...
Git:远程项目代码上传管理
本地代码上传至远端仓库,需要下载git,访问官网下载https://git-scm.com/downloads 一、初始化本地仓库 首先要在项目本地,打开Git Bash,输入以下代码! git init 然后进行全局设置用户名和邮箱,使用以下代码…...
MySQL数据库的介绍
目录 1.什么是MySQL数据库 2.MySQL数据库的设计 MySQL的进一步认识 MySQL的客户端 —— mysql MySQL的服务端 —— mysqld 3.MySQL数据库的架构 MySQL架构图 连接层 服务层 存储引擎层 文件系统层 4.MySQL的存储引擎 认识存储引擎 MySQL中的存储引擎 存储引擎之…...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...
springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...
c++第七天 继承与派生2
这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...
用鸿蒙HarmonyOS5实现中国象棋小游戏的过程
下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...
如何配置一个sql server使得其它用户可以通过excel odbc获取数据
要让其他用户通过 Excel 使用 ODBC 连接到 SQL Server 获取数据,你需要完成以下配置步骤: ✅ 一、在 SQL Server 端配置(服务器设置) 1. 启用 TCP/IP 协议 打开 “SQL Server 配置管理器”。导航到:SQL Server 网络配…...
李沐--动手学深度学习--GRU
1.GRU从零开始实现 #9.1.2GRU从零开始实现 import torch from torch import nn from d2l import torch as d2l#首先读取 8.5节中使用的时间机器数据集 batch_size,num_steps 32,35 train_iter,vocab d2l.load_data_time_machine(batch_size,num_steps) #初始化模型参数 def …...
