MySQL - 替换键:初学者的全面指南

你好,有抱负的数据库爱好者!今天,我们将踏上一段激动人心的旅程,探索MySQL的世界,特别是关注替换键(Alternate Keys)。如果你是编程新手,不用担心——我会一步一步地引导你了解这个概念,就像我多年来教导无数学生一样。所以,拿起一杯咖啡,让我们一起跳进去!

MySQL - Alternate Key

什么是替换键?

在我们深入细节之前,让我们从基础开始。替换键,也称为候选键(Candidate Key),是数据库表中可以潜在地作为主键的列(或列集)。这就像有一把备用钥匙可以打开你的房子——它可以解锁门,但你通常还是使用主钥匙。

在数据库术语中,替换键唯一地标识表中的每条记录,就像主键一样。主要区别在于,尽管可以有多个替换键,但只有一个被选为主键。

现实世界的类比

想象你正在组织一个小型图书馆。每本书都可以通过其ISBN号码、标题和作者组合,或者你分配的唯一条形码唯一标识。所有这些都可以作为标识书籍的键,但你可能会选择ISBN作为你的主要编目方式。其他的则是你的替换键。

替换键的特点

既然我们了解了替换键是什么,让我们探索它们的关键特点:

  1. 唯一性:与主键一样,替换键必须为表中的每条记录包含唯一值。

  2. 非空:替换键不能包含NULL值。它们必须始终具有有效值。

  3. 最小化:它们应使用尽可能少的列来确保唯一性。

  4. 稳定性:替换键列中的值不应频繁更改。

  5. 主键候选:任何替换键都可以潜在地被选为主键。

让我们通过一个例子来说明这些特点:

CREATE TABLE students (
student_id INT AUTO_INCREMENT PRIMARY KEY,
email VARCHAR(50) UNIQUE,
social_security_number VARCHAR(11) UNIQUE,
first_name VARCHAR(50),
last_name VARCHAR(50)
);

在这个students表中,emailsocial_security_number都是替换键。它们是唯一的、非空的(由UNIQUE约束强制),并且如果我们没有选择student_id,它们可以潜在地作为主键。

表中的键类型

为了更好地理解替换键,了解MySQL表中的不同键类型是有帮助的。以下是一个快速概览:

键类型 描述
主键 表中每条记录的主要标识符
替换键(候选键) 可以作为主键的列或列集
外键 引用另一表主键的列
组合键 由两列或更多列组成的键
代理键 仅用于识别目的的人造键

替换键的规则

当使用替换键时,有几个重要的规则需要记住:

  1. 唯一性至关重要:每个替换键必须唯一地标识表中的每条记录。没有两行应该具有相同的替换键值。
CREATE TABLE products (
product_id INT AUTO_INCREMENT PRIMARY KEY,
sku VARCHAR(20) UNIQUE,
name VARCHAR(100),
price DECIMAL(10, 2)
);

在这个例子中,sku(库存单位)是替换键。它被标记为UNIQUE以确保没有两个产品具有相同的SKU。

  1. 不允许空值:替换键必须始终包含一个值。它们不能留空。
ALTER TABLE products
MODIFY sku VARCHAR(20) UNIQUE NOT NULL;

这个修改确保sku字段不能为NULL。

  1. 最小组成:使用最少的列数来达到唯一性。
CREATE TABLE orders (
order_id INT AUTO_INCREMENT PRIMARY KEY,
order_date DATE,
customer_id INT,
UNIQUE KEY (order_date, customer_id)
);

在这里,order_datecustomer_id的组合形成了一个替换键。我们使用这两个,因为单独任何一个都不是唯一的,但它们一起可以唯一地标识一个订单。

  1. 偏好不变性:虽然并非总是可能,但最好替换键列中的值不要经常更改。

  2. 考虑性能:记住,MySQL将为每个UNIQUE约束创建一个索引,这可能会影响大型表上的性能。

CREATE TABLE large_table (
id INT AUTO_INCREMENT PRIMARY KEY,
column1 VARCHAR(50) UNIQUE,
column2 VARCHAR(50) UNIQUE,
-- 在添加过多的UNIQUE约束时要谨慎
data VARCHAR(1000)
);

在这种情况下,拥有多个UNIQUE约束可能会减慢非常大表的插入和更新操作。

实际示例:一个图书数据库

让我们将所有这些知识应用到更复杂的例子中。想象我们正在为一家书店创建数据库:

CREATE TABLE books (
book_id INT AUTO_INCREMENT PRIMARY KEY,
isbn VARCHAR(13) UNIQUE NOT NULL,
title VARCHAR(200) NOT NULL,
author_first_name VARCHAR(50) NOT NULL,
author_last_name VARCHAR(50) NOT NULL,
publication_year INT,
price DECIMAL(10, 2),
UNIQUE KEY (title, author_last_name, author_first_name)
);

在这个books表中:

  • book_id是我们的主键。
  • isbn是一个替换键(每本书都有一个唯一的ISBN)。
  • titleauthor_last_nameauthor_first_name的组合形成另一个替换键(假设没有作者写了两本标题相同的书)。

这种结构允许我们通过多种方式唯一地标识书籍,为我们的查询和数据完整性检查提供了灵活性。

结论

就这样,各位!我们已经穿越了MySQL中替换键的土地,从它们的基本定义到它们的特点、类型以及它们使用的规则。记住,替换键是数据库中的无名英雄——它们提供了额外的确保数据完整性和唯一性的方式。

在你继续MySQL的冒险之旅时,继续尝试不同的表结构和键组合。你练习得越多,数据库设计就会变得越直观。也许有一天,你会发现自己在教导别人替换键的奇妙之处!

快乐编码,愿你的查询总能返回你期望的结果!

Credits: Image by storyset