🎯 本月只剩几天支持 SQLTest.online,帮助我们让 SQL 练习对每个人都免费。 今天捐赠 →
SQL 代码已复制到剪贴板

关系数据库基本概念:表、键和 ACID

第 1.3 课 · 阅读时间:约 10 分钟 · 练习题 ↓

关系数据库把数据组织成通过键相互关联的表。在本课中,你将学习它的基本组成部分:表、列、行、主键、外键、唯一键和约束,并了解 ACID 模型如何在并发访问或系统故障时依然保证事务安全可靠。

在前面的课程中,我们介绍了数据库的概念,并了解了主要的数据库类型。现在我们将深入学习关系数据库的核心组成部分,它们是理解如何用 SQL 组织和访问数据的基础。

示意图:关系数据库结构,两张表通过主键和外键引用相互关联

什么是表、列和行?

关系数据库把数据组织成称为表的结构。可以把表想象成一张电子表格:

  • 表: 一组相关数据的集合。例如,一张表可以存储客户、商品或订单的信息。
  • 列: 表中纵向的一组数据。每一列代表数据的一个特定属性或特征。例如,在 "Customers" 表中,列可以是 "CustomerID"、"FirstName"、"LastName" 和 "Email"。
  • 行: 表中横向的一组数据。每一行代表一个具体的实例或记录。在 "Customers" 表中,每一行代表一位客户。

示例:

来看一张简单的 "Customers" 表:

CustomerIDFirstNameLastNameEmail
1JohnDoejohn.doe@example.com
2JaneSmithjane.smith@example.com
3DavidLeedavid.lee@example.com
  • 整个结构就是名为 "Customers" 的表。
  • "CustomerID"、"FirstName"、"LastName" 和 "Email" 是列。
  • 每一行(例如 "1 | John | Doe | john.doe@example.com")就是一条行记录。

什么是数据库键?主键、外键和唯一键

键是关系数据库中的关键概念。它们用于建立表之间的关系并保证数据完整性。主要的键类型如下:

主键

  • 主键是唯一标识表中每一行的一列(或一组列)。
  • 主键的特点:
    • 唯一: 任意两行的主键值都不能相同。
    • 非空: 主键列不能包含 NULL 值。
  • 在我们的 "Customers" 表中,"CustomerID" 很适合作为主键,因为每位客户都有唯一的 ID,而且不能为空。

外键

  • 外键是一张表中引用另一张表主键的一列(或一组列)。
  • 外键用于建立表之间的关系。
  • 例如,"Orders" 表可以有一个 "CustomerID" 列,作为引用 "Customers" 表中 "CustomerID" 的外键。这样每个订单就与下单的客户关联起来。

唯一键

  • 唯一键是保证该列(或这些列)的值在表的所有行中都不重复的一列(或一组列)。
  • 与主键的区别:
    • 一张表只能有一个主键,但可以有多个唯一键。
    • 唯一键列可以包含 NULL 值(不同数据库的实现略有差异)。
  • 在我们的 "Customers" 表中,"Email" 可以作为唯一键,保证每位客户的邮箱地址都不相同。

什么是 SQL 约束?

约束是作用于列或表的规则,由数据库引擎自动执行。键(主键、外键、唯一键)就是一种约束。在日常 SQL 中,你还会用到其他几种重要的约束:

约束作用
NOT NULL该列必须始终有值,不允许为 NULL。
UNIQUE该列的所有值在各行之间必须互不相同。
PRIMARY KEY相当于 NOT NULL + UNIQUE,唯一标识每一行。
FOREIGN KEY值必须与另一张表某列中已存在的值匹配。
CHECK值必须满足指定条件,例如 age >= 0。

例如,在 customers 表中:

  • customer_id 可以作为 PRIMARY KEY,使每位客户都有唯一标识。
  • email 可以标记为 UNIQUE,使两位客户不能共用同一个邮箱地址。
  • age 可以使用 CHECK 规则,例如 age >= 0,从而拒绝负数年龄。

数据库会自动执行这些规则并拒绝无效的修改,这有助于保持数据一致,而无需在应用层额外检查。

什么是 ACID?关系数据库中的事务安全

使用关系数据库时,另一个核心概念是 ACID 模型。ACID 定义了使数据库事务安全可靠的特性。

事务是被当作一个工作单元处理的一组操作。例如,在两个银行账户之间转账通常至少包含两个操作:

  1. 从账户 A 扣除金额。
  2. 向账户 B 增加金额。

这两步必须一起成功,否则一步都不应生效。

ACID 代表:

  • 原子性(Atomicity): 事务是“全有或全无”的。只要有一步失败,整个事务就会回滚。
  • 一致性(Consistency): 事务必须让数据库从一个有效状态转到另一个有效状态,并遵守所有已定义的规则和约束。
  • 隔离性(Isolation): 并发事务之间不应相互干扰而导致错误结果。
  • 持久性(Durability): 事务一旦提交,其修改就是永久的,即使断电或系统崩溃也不会丢失。

在银行、电商和库存管理等真实系统中,错误或不完整的更新可能造成严重问题,因此这些特性必不可少。


本课要点:

  • 关系数据库把数据存放在由列和行组成的表中。
  • 主键唯一标识每一行,必须唯一且非空。
  • 外键把一张表中的行与另一张表中的行关联起来,保证参照完整性。
  • 唯一键保证列中的值不重复,一张表可以有多个唯一键。
  • 约束(NOT NULL、CHECK)在数据库层面自动执行数据规则。
  • ACID 模型(原子性、一致性、隔离性、持久性)保证事务在发生故障或并发访问时依然可靠。

常见问题

主键和唯一键有什么区别?

主键唯一标识每一行,且不能为 NULL,一张表只能有一个主键。唯一键同样保证唯一性,但可以包含 NULL,而且一张表可以有多个唯一键。用主键作为行的主要标识,用唯一键保证 email 等其他列的唯一性。

外键可以引用唯一键而不是主键吗?

可以。外键可以引用任何带唯一约束的列(或一组列),而不仅仅是主键。不过,引用主键是最常见、也最推荐的做法。

如果 ACID 事务执行到一半失败了,会发生什么?

原子性保证整个事务被回滚,数据库恢复到事务开始之前的状态,不会保存任何部分修改。

面试问题

在面试中你会如何解释主键?

主键是唯一标识表中每一行的一列或多列组合。它必须唯一、不能包含 NULL 值,并且每张表只能有一个。其他表的外键引用以它为锚点。

什么是参照完整性,外键如何保证它?

参照完整性是指一张表中的外键值必须始终与被引用表中已存在的主键值匹配,或者为 NULL。数据库引擎会自动执行这一点:插入找不到对应记录的外键值,或删除被引用的行,都会被拒绝,除非定义了级联规则。

ACID 代表什么,为什么重要?

ACID 代表原子性、一致性、隔离性和持久性。它定义了使数据库事务可靠的保证。没有 ACID,并发写入可能破坏数据,部分失败可能让数据库处于无效状态,已提交的修改也可能在崩溃后丢失。正因为有 ACID,金融、医疗等关键系统才信任关系数据库。

尝试解决以下任务,以巩固您在本课中学到的内容。

  1. 什么是ACID?
  2. 关系型数据库中的关系
  3. 确定关系类型
  4. 关系数据库中的数据是如何存储的?
  5. SQL中的约束是什么?