MS Access 中的每个表都需要一个主键吗?

Luk*_*Hsu 6 ms-access

我是 MSAccess 的新手,所以我不确定;我的数据库中的每个表都必须有一个主键吗?我有一张看起来像这样的表:

( http://i108.photobucket.com/albums/n32/lurker3345/ACCESSHELP.png?t=1382688844 )

在这种情况下,每个字段/列都有一个重复项。我尝试将主键分配给每个字段,但它返回一个错误,指出有一个重复的字段。

我该怎么做?

Bas*_*que 5

严格来说,是的,关系数据库中的每一行都应该有一个主键(唯一标识符)。如果做一些又快又脏的工作,你也许可以一事无成。

内部跟踪 ID

如果您不明确分配主键,某些数据库会在幕后生成主键。每个数据库都需要某种方式在内部跟踪每一行。

自然键

一个自然的关键是有意义的数据,恰好唯一标识每一行的现有字段。例如,如果您要跟踪分配给团队的人员,则“人员”表中可能会有“employee_id”列。

代理键

一个代理键是你添加到表中,只是指定为唯一标识符的任意值一个额外的列。如果您的数据库(例如Postgres)支持该数据类型,您可以分配一个序列号(1、2、3...)或一个UUID。分配序列号或 UUID 非常普遍,以至于几乎每个数据库引擎都提供了内置工具来帮助您自动创建这样的值并分配给新行。

我的建议

根据我的经验,任何严肃的长期项目都应该使用代理键,因为我曾经想使用的每个自然键最终都会改变。人们改变他们的名字(结婚等)。当公司被另一个公司收购时,员工 ID 会发生变化。

另一方面,如果您正在做一项快速而肮脏的工作,例如分析单批数据以生成图表一次又一次,并且您的数据碰巧有一个自然键,然后使用它。当心:一次性工作通常有办法成为经常性工作。

进一步的建议... 从您无法控制的来源导入数据时,即使导入包含候选键,也要分配您自己的标识符。

复合键

某些数据库引擎提供复合键功能,也称为复合键,其中将表中的两列或更多列组合以创建单个值,该值一旦组合就应证明是唯一的。例如,在“person”表中,“first_name”和“last_name”以及“phone_number”字段放在一起考虑时可能是唯一的。除非两个人结婚并共享相同的家庭电话号码,同时还发生每个人都被命名为“亚历克斯”并使用共享姓氏!由于此类冲突以及有意义的数据变化的趋势以及计算此类组合值的开销,建议坚持使用简单(单列)键,除非您有特殊情况。


gre*_*g84 2

如果数据自然不具有用作主键的唯一字段,请添加一个名为“Id”或类似名称的自动生成的整数列。

阅读本页的“如何组织我的数据”部分:

http://www.htmlgoodies.com/primers/database/article.php/3478051

此页面向您展示如何创建一个(在“添加自动编号主键”下):

http://office.microsoft.com/en-gb/access-help/create-or-remove-a-primary-key-HA010014099.aspx