课程 1.3 · 阅读时间:~10分钟
关系数据库将数据组织成通过键连接的表。在本课中,您将学习核心构建块——表、列、行、主键、外键、唯一键和约束——并发现ACID模型如何在并发访问或系统故障下保持事务的安全性和可靠性。
关系数据库概念:表、键和ACID
在之前的课程中,我们介绍了数据库的概念,并查看了主要的数据库类型。现在,我们将深入探讨关系数据库的核心组件,这对于理解如何使用SQL组织和访问数据至关重要。

表、列和行是什么?
关系数据库将数据组织成称为表的结构。可以将表视为电子表格:
- 表: 一组相关数据。例如,一个表可能存储有关客户、产品或订单的信息。
- 列: 表中的一组垂直数据。每列代表数据的特定属性或特征。例如,在“客户”表中,列可能是“CustomerID”、“FirstName”、“LastName”和“Email”。
- 行: 表中的一组水平数据。每行代表数据的单个实例或记录。在“客户”表中,每行将代表一个单独的客户。
示例:
让我们可视化一个简单的“客户”表:
| CustomerID | FirstName | LastName | |
|---|---|---|---|
| 1 | John | Doe | john.doe@example.com |
| 2 | Jane | Smith | jane.smith@example.com |
| 3 | David | Lee | david.lee@example.com |
- 整个结构是名为“客户”的表。
- “CustomerID”、“FirstName”、“LastName”和“Email”是列。
- 每一行(例如,“1 | John | Doe | john.doe@example.com”)是一个行。
数据库键是什么?主键、外键和唯一键
键是关系数据库中的一个关键概念。它们用于建立表之间的关系并强制数据完整性。以下是主要的键类型:
主键
- 主键是一个列(或一组列),它唯一标识表中的每一行。
- 主键的特征:
- 唯一: 没有两行可以具有相同的主键值。
- 非空: 主键列不能包含NULL值。
- 在我们的“客户”表中,“CustomerID”是一个很好的主键候选,因为每个客户都有一个唯一的ID,并且它不能为空。
外键
- 外键是一个列(或一组列),在一个表中引用另一个表的主键。
- 外键建立表之间的关系。
- 例如,如果我们有一个“订单”表,它可能有一个“CustomerID”列,该列是引用“客户”表中“CustomerID”的外键。这将每个订单链接到下单的客户。
唯一键
- 唯一键是一个列(或一组列),确保列中的值在表的所有行中都是唯一的。
- 与主键的区别:
- 一个表只能有一个主键,但可以有多个唯一键。
- 唯一键列可以允许NULL值(尽管实现略有不同)。
- 在我们的“客户”表中,“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定义了使数据库事务安全可靠的属性。
事务是一组作为一个工作单元处理的操作。例如,在两个银行账户之间转账通常涉及至少两个操作:
- 从账户A中扣除资金。
- 向账户B中添加资金。
这两个步骤必须一起成功,否则都不应应用。
ACID代表:
- 原子性: 事务是“全有或全无”。如果一个步骤失败,整个事务将回滚。
- 一致性: 事务必须将数据库从一个有效状态移动到另一个有效状态,保留所有定义的规则和约束。
- 隔离性: 并发事务不应以导致不正确结果的方式相互干扰。
- 持久性: 一旦事务被提交,其更改是永久的,即使发生电源故障或系统崩溃。
这些属性在银行、电子商务和库存管理等现实世界系统中至关重要,因为不正确或部分更新可能会导致严重问题。
本课的关键要点:
- 关系数据库将数据存储在由列和行组成的表中。
- 主键唯一标识每一行;它必须是唯一的且非空。
- 外键将一个表中的行链接到另一个表中的行,强制执行引用完整性。
- 唯一键确保列中的唯一性,但允许每个表有多个唯一键。
- 约束(
NOT NULL、CHECK)在数据库级别自动强制执行数据规则。 - ACID模型(原子性、一致性、隔离性、持久性)确保事务在故障或并发访问下仍然可靠。
在下一课中,我们将查看关系数据库中使用的基本数据类型,以及如何为每列选择正确的类型。
常见问题解答
主键和唯一键之间有什么区别?
主键唯一标识每一行,且不能为NULL。一个表只能有一个主键。唯一键也强制唯一性,但可以允许NULL值,并且一个表可以有多个唯一键。使用主键作为主要行标识符;使用唯一键来强制其他列(如email)的唯一性。
外键可以引用唯一键而不是主键吗?
可以。外键可以引用任何具有唯一约束的列(或列集),不仅仅是主键。然而,引用主键是最常见和推荐的做法。
如果ACID事务在中途失败会发生什么?
原子性确保整个事务被回滚,使数据库恢复到事务开始前的状态。没有部分更改被保存。
面试问题
您如何在面试中解释主键?
主键是唯一标识表中每一行的列或列组合。它必须是唯一的,不能包含NULL值,并且每个表只能有一个。它用作其他表的外键引用的锚点。
什么是引用完整性,外键如何强制执行它?
引用完整性意味着一个表中的外键值必须始终与被引用表中的现有主键值匹配,或者为NULL。数据库引擎会自动强制执行这一点——尝试插入孤立的外键值或删除被引用的行将被拒绝,除非定义了级联规则。
ACID代表什么,为什么重要?
ACID代表原子性、一致性、隔离性和持久性。它定义了使数据库事务可靠的保证。没有ACID,并发写入可能会损坏数据,部分故障可能会使数据库处于无效状态,已提交的更改可能在崩溃后丢失。ACID是关系数据库在金融、医疗和其他关键系统中受到信任的原因。