主键和代理键有什么区别?

What is the difference between a primary key and a surrogate key?

我在谷歌上搜索了很多,但没有找到带有示例的确切直接答案。

任何例子都会更有帮助。

这是描述各种键的好方法:

http://www.agiledata.org/essays/keys.html

我认为 Michelle Poolet 描述得非常清楚:

A surrogate key is an artificially produced value, most often a system-managed, incrementing counter whose values can range from 1 to n, where n represents a table's maximum number of rows. In SQL Server, you create a surrogate key by assigning an identity property to a column that has a number data type.

http://sqlmag.com/business-intelligence/surrogate-key-vs-natural-key

当您更改具有标识列的复合键时,它通常会帮助您使用代理键。

代理键通常是一个数值。在 SQL 服务器中,Microsoft 允许您定义具有标识 属性 的列以帮助生成代理项键值。

PRIMARY KEY 约束唯一标识数据库中的每条记录table。 主键必须包含唯一值。 主键列不能包含 NULL 值。 大多数 table 应该有一个主键,每个 table 只能有一个主键。

http://www.databasejournal.com/features/mssql/article.php/3922066/SQL-Server-Natural-Key-Verses-Surrogate-Key.htm

主键是您选择的 table 中的唯一键,它最能唯一地标识 table 中的记录。所有 table 都应该有一个主键,因为如果您需要更新或删除记录,您需要知道如何唯一地标识它。

代理键是人工生成的键。当您的记录基本上没有自然键(例如 Person table 时,它们很有用,因为同一天出生的两个人可能具有相同的名字,或者日志中的记录,因为有可能发生两个事件,所以它们带有相同的时间戳)。大多数情况下,您会看到这些实现为自动递增字段中的整数,或作为为每条记录自动生成的 GUID。 ID 号几乎总是代理键。

然而,与主键不同,并非所有 table 都需要代理键。如果您有一个列出美国各州的 table,您实际上并不需要它们的 ID 号。您可以使用州缩写作为主键代码。

代理键的主要优点是很容易保证它们的唯一性。主要缺点是它们没有任何意义。例如,“28”是威斯康星州没有任何意义,但是当您在地址 table 的州列中看到 'WI' 时,您知道您在谈论哪个州而无需查找state 是你所在的州 table.

代理键 是一个虚构的值,其唯一目的是唯一标识一行。通常,这由一个自动递增的 ID 表示。

示例代码:

CREATE TABLE Example
(
    SurrogateKey INT IDENTITY(1,1) -- A surrogate key that increments automatically
)

主键是table的标识列或列集。 可以是代理键 或任何其他唯一的列组合(例如复合键)。对于任何行都必须是唯一的,并且不能是 NULL.

示例代码:

CREATE TABLE Example
(
    PrimaryKey INT PRIMARY KEY -- A primary key is just an unique identifier
)

所有键都是标识符,用作它们标识的事物的代理项。 E.F.Codd 解释了 系统分配的 代理的概念如下 [1]:

Database users may cause the system to generate or delete a surrogate, but they have no control over its value, nor is its value ever displayed to them.

这就是通常所说的代理键。但是,该定义立即存在问题,因为 Codd 假设 DBMS 会提供这样的功能。 DBMS 通常没有这样的功能。密钥通常至少对某些 DBMS 用户可见,因为显而易见的原因,它们必须如此。因此,代理人的概念在使用中略有变化。该术语通常用于数据管理专业,表示不公开的密钥,用作业务领域中的标识符。请注意,这基本上与密钥的生成方式或 "artificial" 的感知方式无关。所有的键都由人类或机器发明的符号组成。因此,术语代理项的唯一可能意义与密钥的使用方式有关,而不是密钥的创建方式或其值是什么。

[1] 扩展数据库关系模型以捕捉更多意义,E.F.Codd,1979