我进行了大量的谷歌搜索,但没有找到确切的简单明了的答案,并带有示例。
如果有示例的话,将更加有帮助。
我进行了大量的谷歌搜索,但没有找到确切的简单明了的答案,并带有示例。
如果有示例的话,将更加有帮助。
主键是您选择的在表中唯一标识记录的最佳键。所有表都应该有一个主键,因为如果您需要更新或删除记录,您需要知道如何唯一地标识它。
代理键是人工生成的键。当您的记录基本上没有自然键时(例如表,因为可能出生于同一日期的两个人具有相同的姓名,或记录在日志中,因为可能会发生两个事件,使得它们具有相同的时间戳)。通常,您会将它们实现为自动递增字段中的整数,或者作为为每个记录自动生成的GUID。ID号几乎总是代理键。
与主键不同,不是所有表都需要代理键。如果您有一个列出美国州份的表,则实际上不需要其ID编号。您可以使用州缩写作为主键代码。
代理键的主要优点是易于确保唯一性。其主要缺点是它们没有任何意义。例如,“28”不表示威斯康星州,但是当您在地址表的州/省列中看到“WI”时,您无需查找状态表即可知道所讨论的州/省是哪个。
代理键是一种虚构的值,其唯一目的是标识行。通常,这由自动递增的ID表示。
示例代码:
CREATE TABLE Example
(
SurrogateKey INT IDENTITY(1,1) -- A surrogate key that increments automatically
)
主键是表的标识列或一组标识列。可以是 代理键 或任何其他唯一的列组合(例如复合键)。必须对于任何行都是唯一的,且不能为NULL
。
示例代码:
CREATE TABLE Example
(
PrimaryKey INT PRIMARY KEY -- A primary key is just an unique identifier
)
所有键都是用作它们所标识的事物的代理的标识符。E.F.Codd解释了系统分配代理的概念如下[1]:
数据库用户可能会导致系统生成或删除代理,但他们无法控制其值,也不会将其值显示给他们。
这就是所谓的代理键。然而,定义立即存在问题,因为Codd假设DBMS将提供此功能。通常,DBMS没有此类功能。由于某些明显的原因,键通常对至少一些DBMS用户可见。因此,代理的概念在使用中略有变化。该术语通常在数据管理专业中用于表示在业务领域中未公开使用作为标识符的键。请注意,这与密钥的生成方式或被认为是多么“人工”完全无关。所有密钥都由人类或机器发明的符号组成。因此,术语代理的唯一可能意义与密钥的使用方式有关,而不是与其创建方式或值有关。
[1] 扩展数据库关系模型以捕获更多含义,E.F.Codd,1979年
代理键通常是一个数字值。在SQL Server中,Microsoft允许您定义一个带有标识属性的列,以帮助生成代理键值。
主键约束唯一标识数据库表中的每个记录。 主键必须包含唯一值。 主键列不能包含NULL值。 大多数表应该有一个主键,并且每个表只能有一个主键。
我认为Michelle Poolet用非常清晰的方式描述了它:
代理键是一种人工生成的值,通常是系统管理的递增计数器,其值可以从1到n,其中n表示表的最大行数。在SQL Server中,您可以通过将标识属性分配给具有数字数据类型的列来创建代理键。
http://sqlmag.com/business-intelligence/surrogate-key-vs-natural-key
当您使用具有标识列的复合键进行更改时,使用代理键通常会有所帮助。