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

devtools/2024/11/9 16:46:14/

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

主键(Primary Key)

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

示例代码:

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

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

外键(Foreign Key)

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

示例代码:

sql">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. 备份与恢复:

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

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


http://www.ppmy.cn/devtools/110221.html

相关文章

15 三数之和

解题思路: \qquad 要找到所有和为0的三元组,使用暴力去解的话时间复杂度为 O ( N 3 ) O(N^3) O(N3),但是这样会超时。若三数之和为0,那么只要知道其中的两个,就可以知道第三个数的值。进而可以想到用map这样的数据结…

Mysql高级篇(中)——SQL性能分析

Mysql高级篇(中)—— SQL性能分析 一、(了解)MySQL Query Optimizer 的主要功能和原理二、(了解)MySQL 常见瓶颈三、关键字 EXPLAIN1、是什么2、基本语法3、EXPLAIN 执行信息详解(1&#xff09…

享元模式flyweight

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/flyweight 通过共享多个对象所共有的相同状态, 让你能在有限的内存容量中载入更多对象。享元会将不同对象的相同数据进行缓存以节省内存。 factory里面treeType共用了

GS-SLAM论文阅读笔记--MM-Gaussian

介绍 这是一篇多模态的GS-SLAM,也已经被IROS2024录用。由于多传感器融合的GS-SLAM还是比较少的,所以应该仔细阅读一篇。 文章目录 介绍1.背景介绍2.关键内容2.1 跟踪2.2 重定位2.3 建图2.4总体流程 3.文章贡献 1.背景介绍 传统的SLAM方法往往受到地图…

C++ 第一阶段(基础语法)

c初识 创建项目 编写“HelloWorld”代码 #include <iostream> using namespace std; int main() {cout << "Hello World!\n"; }注释 单行注释 //表述信息 多行注释 /*表述信息*/ 变量 作用:给一段指定的内存空间起名&#xff0c;方便操作这段内存 语…

【区块链通用服务平台及组件】浪潮云链区块链平台 | FISCO BCOS应用案例

浪潮集团正式发布企业级区块链应用平台浪潮云链区块链平台&#xff08;IBC&#xff09;V4.0&#xff08;简称“IBC 平台”&#xff09;。平台突破链数 融合的高并发区块链引擎、区块链增强隐私计算技术、可插拔多语言智能合约等核心技术&#xff0c;引入 FISCO BCOS 作为底层引…

OFDM系统PAPR算法的MATLAB仿真,对比SLM,PTS以及CAF,对比不同傅里叶变换长度

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1、选择映射&#xff08;SLM&#xff09; 4.2 相位截断星座图&#xff08;PTS&#xff09; 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 mat…

Vue组件:混入

1、基本用法 混入是一种为组件提供可复用功能的非常灵活的方式。混入对象可以包含任意的组件选项。当组件使用混入对象时&#xff0c;混入对象中的所有选项将被混入该组件本身的选项中。 语法格式如下&#xff1a; <script> //第一步&#xff1a;引用 mixin 对象 impo…