我是MSAccess的新手,所以我不确定这个;我必须为数据库中的每个表都有一个主键吗?我有一张看起来像这样的表:
(http://i108.photobucket.com/albums/n32/lurker3345/ACCESSHELP.png?t=1382688844)
在这种情况下,每个字段/列都有重复的术语。我已经尝试将主键分配给每个字段,但它返回时出现错误,表示存在重复字段。
我该怎么做?
答案 0 :(得分:4)
严格地说,是的,关系数据库中的每一行都应该有Primary Key(唯一标识符)。如果做快速而肮脏的工作,你可以在没有人的情况下离开。
如果您未明确指定一个主数据库,则某些数据库会生成一个主键。每个数据库都需要一些方式来内部跟踪每一行。
natural key是一个现有字段,其中包含有意义的数据,恰好可以唯一地标识每一行。例如,如果您要跟踪分配给团队的人员,则可能会在“人员”表格中显示“employee_id”列。
surrogate key是您添加到表中的额外列,只是为了将任意值指定为唯一标识符。如果您的数据库(例如UUID)支持该数据类型,您可以分配序列号(1,2,3,...)或Postgres。分配序列号或UUID非常常见,几乎每个数据库引擎都提供内置工具来帮助您自动创建这样的值并分配给新行。
根据我的经验,任何严肃的长期项目都应该始终使用代理键,因为我曾经试图使用的每一个自然键最终都会发生变化。人们改变他们的名字(结婚等)。当公司被另一家公司收购时,员工ID会发生变化。
另一方面,如果您正在做一项快速而肮脏的工作,例如分析一批数据以生成图表一次又一次,并且您的数据碰巧有一个自然键,那么就使用它。注意:一次性工作通常有办法成为经常性的工作。
进一步的建议......从控件之外的源导入数据时,即使导入包含candidate key,也要指定自己的标识符。
某些数据库引擎提供composite key功能,也称为复合键,其中表中的两列或多列组合在一起以创建单个值,该值一旦合并就应该证明是唯一的。例如,在“人”表中,“first_name”和“last_name”以及“phone_number”字段在一起考虑时可能是唯一的。除非两个人结婚并分享相同的家庭电话号码,同时每个人都会被命名为“Alex”并使用共享的姓氏!由于这种冲突以及有意义的数据变化的趋势以及计算这些组合值的开销,建议坚持使用简单(单列)密钥,除非您有特殊情况。
答案 1 :(得分: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
答案 2 :(得分:1)
在使用DataAdapter和货币管理器时,您的表必须具有主键才能将更新,添加和删除推送回数据库。否则,他们将不会注册,您将收到错误。
我失去了一个星期,直到我将其添加到Try-Catch-End Try块:MsgBox(er.ToString),其中提到" key"。从那里,我想出来了。 (注意:拥有主键不是VB6中的必备条件)
答案 3 :(得分:0)
没有主键通常意味着您的数据结构不佳。但是,看起来你在那里处理汇总/汇总数据,所以它可能并不重要。