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

时间:2016-04-21 14:43:28

标签: sql sql-server sql-server-2008 sql-server-2005 sql-server-2012

我搜索了很多,但我没有找到一个例子的确切直接答案。

任何这方面的例子都会更有帮助。

6 个答案:

答案 0 :(得分:57)

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

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

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

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

答案 1 :(得分:6)

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

示例代码:

x

主键是表格的标识列或列集。 可以是代理键或任何其他唯一的列组合(例如复合键)。必须对任何行都是唯一的,不能是CREATE TABLE Example ( SurrogateKey INT IDENTITY(1,1) -- A surrogate key that increments automatically )

示例代码:

NULL

答案 2 :(得分:3)

所有密钥都是用作其识别内容的代理的标识符。 E.F.Codd解释了系统指定的代理的概念如下[1]:

  

数据库用户可能会导致系统生成或删除代理项,   但他们无法控制其价值,也无法控制其价值   显示给他们。

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

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

答案 3 :(得分:1)

这是描述各种键的绝佳方法:

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

答案 4 :(得分:1)

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

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

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

答案 5 :(得分:-1)

我认为Michelle Poolet以一种非常清晰的方式描述它:

  

代理键是人为产生的价值,通常是a   系统管理的递增计数器,其值可以从1到1   n,其中n表示表的最大行数。在SQL Server中,   您通过为a分配标识属性来创建代理键   具有数字数据类型的列。

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

当您使用标识列更改复合键时,它通常可以帮助您使用代理键。