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

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具&#xff0c;可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板&#xff0c;允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板&#xff0c;并通…...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战&#xff0c;克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

招商蛇口 | 执笔CID,启幕低密生活新境

作为中国城市生长的力量&#xff0c;招商蛇口以“美好生活承载者”为使命&#xff0c;深耕全球111座城市&#xff0c;以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子&#xff0c;招商蛇口始终与城市发展同频共振&#xff0c;以建筑诠释对土地与生活的…...

关于easyexcel动态下拉选问题处理

前些日子突然碰到一个问题&#xff0c;说是客户的导入文件模版想支持部分导入内容的下拉选&#xff0c;于是我就找了easyexcel官网寻找解决方案&#xff0c;并没有找到合适的方案&#xff0c;没办法只能自己动手并分享出来&#xff0c;针对Java生成Excel下拉菜单时因选项过多导…...

抽象类和接口(全)

一、抽象类 1.概念&#xff1a;如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象&#xff0c;这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法&#xff0c;包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中&#xff0c;⼀个类如果被 abs…...

云原生周刊:k0s 成为 CNCF 沙箱项目

开源项目推荐 HAMi HAMi&#xff08;原名 k8s‑vGPU‑scheduler&#xff09;是一款 CNCF Sandbox 级别的开源 K8s 中间件&#xff0c;通过虚拟化 GPU/NPU 等异构设备并支持内存、计算核心时间片隔离及共享调度&#xff0c;为容器提供统一接口&#xff0c;实现细粒度资源配额…...