主键 (primary key) 唯一标识表中的每一行;外键 (foreign key) 引用另一个表的主键,在表之间建立关系并强制执行引用完整性 (referential integrity)(不能引用不存在的行)。
主键 — 唯一行标识
users (
id ,
name (),
email ()
);
主键 (primary key) 唯一标识表中的每一行;外键 (foreign key) 引用另一个表的主键,在表之间建立关系并强制执行引用完整性 (referential integrity)(不能引用不存在的行)。
users (
id ,
name (),
email ()
);
主键是唯一的且非空的 — 它标识每一行。它会自动创建索引(快速查找),这是外键引用的对象。
CREATE TABLE orders (
id INT PRIMARY KEY,
user_id INT,
total DECIMAL(10,2),
FOREIGN KEY (user_id) REFERENCES users(id) -- user_id must match a users.id
);
外键 (user_id) 引用另一个表的主键 (users.id),建立"一个订单属于一个用户"的关系。数据库强制执行这一点:你不能插入 user_id 不存在于 users 中的订单。
INSERT INTO orders (user_id, total) VALUES (999, 50); -- ❌ ERROR if user 999 doesn't exist
-- the foreign key PREVENTS orphaned records (orders referencing non-existent users)
引用完整性意味着数据库保证关系有效 — 你不能有一个订单引用不存在的用户。这可以防止来自孤立/无效引用的数据损坏。
FOREIGN KEY (user_id) REFERENCES users(id)
ON DELETE CASCADE -- delete the user → delete their orders too
-- ON DELETE SET NULL -- set user_id to NULL
-- ON DELETE RESTRICT -- prevent deleting a user who has orders (default-ish)
ON DELETE/ON UPDATE 定义当被引用的行被删除或更改时,相关行会发生什么 — CASCADE(级联)、SET NULL 或 RESTRICT(限制)。正确选择很重要,以避免意外的数据丢失或孤立行。
主键和外键是关系数据库设计的基础 — 它们是关系模型在表之间建立身份和关系的方式,因此理解它们对于设计和使用任何关系数据库至关重要。主键(唯一标识每一行、自动索引)是表身份的基础,也是关系引用的对象。外键建立表之间的关系(订单属于用户等),这些关系定义了应用程序数据的关系结构。
至关重要的是,外键强制执行引用完整性 — 数据库保证关系有效(你不能引用不存在的行),这防止数据损坏来自孤立或无效引用,这是一个重大的可靠性优势,可自动维护数据一致性。
理解 ON DELETE/ON UPDATE 行为(CASCADE、SET NULL、RESTRICT)很重要,因为它们决定了当被引用的行更改或删除时相关数据会发生什么 — 正确选择可以防止意外的数据丢失(例如 CASCADE 删除超出预期)或孤立记录,这是一个后果重大的设计决策。
由于表之间的关系是关系数据库的本质,而且由于主键/外键(和引用完整性)是如何定义和保护这些关系的,理解它们 — 用于身份和关系的键、用于数据一致性的引用完整性,以及用于管理相关数据的 on-delete 行为 — 是数据库设计的核心、基础知识,也是使用关系数据正确工作所需的常见面试主题。