当前位置: 首页 > 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中的存储引擎 存储引擎之…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

AspectJ 在 Android 中的完整使用指南

一、环境配置&#xff08;Gradle 7.0 适配&#xff09; 1. 项目级 build.gradle // 注意&#xff1a;沪江插件已停更&#xff0c;推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...

关于uniapp展示PDF的解决方案

在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项&#xff1a; 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库&#xff1a; npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...