主键和代理键有什么区别?
What is the difference between a primary key and a surrogate key?
我在谷歌上搜索了很多,但没有找到带有示例的确切直接答案。
任何例子都会更有帮助。
这是描述各种键的好方法:
我认为 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 只能有一个主键。
主键是您选择的 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
我在谷歌上搜索了很多,但没有找到带有示例的确切直接答案。
任何例子都会更有帮助。
这是描述各种键的好方法:
我认为 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 只能有一个主键。
主键是您选择的 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