6

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

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

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

我该怎么做?

4

4 回答 4

5

严格来说,是的,关系数据库中的每一行都应该有一个主键(唯一标识符)。如果做快速而肮脏的工作,你可能没有一个就可以逃脱。

内部跟踪 ID

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

自然键

自然是具有有意义数据的现有字段,恰好可以唯一地标识每一行。例如,如果您正在跟踪分配到团队的人员,则“person”表上可能有一个“employee_id”列。

代理键

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

我的建议

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

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

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

复合键

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

于 2013-10-25T09:12:06.293 回答
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

于 2013-10-25T08:24:17.343 回答
1

在您使用 DataAdapter 和 Currency Manager 时,您的表必须有一个主键才能将更新、添加和删除推送回数据库。否则,他们将不会注册,您将收到错误消息。

我失去了一周的时间来解决这个问题,直到我将它添加到 Try-Catch-End Try 块中:MsgBox(er.ToString) 提到了“key”。从那里,我想通了。(注意:拥有主键在 VB6 中不是必需的)

于 2016-10-30T09:08:06.880 回答
0

没有主键通常意味着您的数据结构不佳。但是,看起来您正在那里处理摘要/聚合数据,所以这可能无关紧要。

于 2013-10-25T08:30:57.100 回答