ms-access - MS Access 中的每个表都需要主键吗?

标签 ms-access

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

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

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

我该如何解决这个问题?

最佳答案

严格来说,是的,关系数据库中的每一行都应该有一个 Primary Key (唯一标识符)。如果做的是快速而肮脏的工作,你也许可以在没有人的情况下逃脱。

内部跟踪 ID

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

自然键

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

代理键

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

我的建议

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

另一方面,如果您正在做一项快速而肮脏的工作,例如分析一批数据以一次生成图表,并且不再生成图表,并且您的数据碰巧有一个自然键,那么请使用它。请注意:一次性工作通常会成为重复性工作。

进一步建议...从您无法控制的来源导入数据时,请分配您自己的标识符,即使导入包含 candidate key .

复合键

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

关于ms-access - MS Access 中的每个表都需要主键吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19584597/

相关文章:

mysql - MS Access - 在一份报告中使用多个查询

ms-access - DoCmd.TransferSpreadsheet 问题

vba - 从 Access 发送电子邮件

c# - 更新 ExceptionNonQuery

ms-access - 是否可以将二进制变量显示为数据 TableView 表单中的复选框?

java - 使用 Spring jdbcTemplate 更新 MS Access 中的日期

c# - 使用 C# 和 MS Access SQL 创建表

sql - 使用 VBA 自动更新/复制 Microsoft Access 中的表

excel - VBA将Excel电子表格逐行导入Access

sql - 多表 Access 查询