Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ms access 主键的自动编号与文本字符串?_Ms Access_Primary Key_Primary Key Design - Fatal编程技术网

Ms access 主键的自动编号与文本字符串?

Ms access 主键的自动编号与文本字符串?,ms-access,primary-key,primary-key-design,Ms Access,Primary Key,Primary Key Design,我正试图为我刚刚遇到的问题找到最好的解决方案。我讨厌做不懂的事情,所以我希望有人能帮我 我有一个Access数据库,其中一个表存储酒店信息,另一个表存储行程。“行程表”将从“酒店”表上的酒店列表中选择 我想建立一个适当的关系,但在Hotels表上使用连接到Investures表上Hotels字段的Autonumber主键是行不通的。(因为自动编号ID与酒店名称不匹配。) 是否最好: A.使用hotels名称作为hotels表上的主键,即使字符串长度可能很长 B.将“行程表”中“酒店”字段上的“显

我正试图为我刚刚遇到的问题找到最好的解决方案。我讨厌做不懂的事情,所以我希望有人能帮我

我有一个Access数据库,其中一个表存储酒店信息,另一个表存储行程。“行程表”将从“酒店”表上的酒店列表中选择

我想建立一个适当的关系,但在Hotels表上使用连接到Investures表上Hotels字段的Autonumber主键是行不通的。(因为自动编号ID与酒店名称不匹配。)

是否最好:

A.使用hotels名称作为hotels表上的主键,即使字符串长度可能很长

B.将“行程表”中“酒店”字段上的“显示”控件更改为列出“酒店表自动编号”主键但将其隐藏的组合框。相反,它显示带有酒店名称的列。我在这里找到了解决方案:

这两种解决方案似乎都不完美,因为我认为解决方案A可能会使用长文本字符串降低索引速度,如果在表中插入新字段,则解决方案B会出错

我不想在这里选择错误的答案,在今后的道路上遇到问题

有人能帮我吗?如果我需要澄清问题的任何部分,请告诉我


谢谢

自动编号是设置主键最有效的方法,对于DBMS来说,通过搜索找到它要查找的内容是最简单的工作。如果要在表中建立主键/外键关系,则尤其如此


更不用说,出于存储目的和索引目的这样做有很多好处(对访问来说不是什么大问题,但对其他人来说可能是)

您几乎不应该将名称用作主键。以
code
ID
的形式使用唯一ID是一种更安全的方法。避免使用名称允许您:

  • 从标识符中提取名称
  • 将名称存储在单个位置
  • 如果需要,在单个位置更改名称
  • 使用更少的磁盘空间和内存
  • 执行更快的索引、插入、删除、联接、排序和分组
有时您已经有了代码或ID,或者您受到内部/外部规则的约束,但大多数情况下,自动编号的主键非常有用。它是:

  • 数值,因此它的存储效率很高
  • 数字,因此使用起来很快
  • 保证是独一无二的

  • 新条目总是插入到表的末尾,页面移动或索引更改所需的工作量最小

对于当前速度快的计算机,对于几十条或数百条记录,使用文本或数字PK没有明显区别,但对于数千条以上的记录,问题肯定会有所不同,数字是CPU的朋友,因为它是处理器处理的最简单的数据类型。如果我假设一个表将有数千条记录,那么我将使用Neumeric,最好是长类型。

谢谢您的回答-那么选项B是最好的吗?或者我还有其他方法可以使用自动编号来建立关系吗?不知道为什么您会认为“如果在表中插入新字段,解决方案B会出错。”这是正确的方法-您只需更改组合框以按酒店名称排序-显示中没有任何内容会出错。如果您愿意,您仍然可以在hotel name中添加索引,以加快排序。该解决方案的唯一功能是选择列计数和列宽。假设键是第1列,您想要的显示是第2列。您需要将查找工具设置为2列,并将宽度设置为0“1”。如果在第二列之前插入新字段,则会显示该字段。我的意思是,我想我可以记住不要插入字段,但似乎应该有更好的方法。@arbitel:这真的不是问题。将您的组合框设为行Source
选择HotelID,HotelName FROM Hotels
,您可以在
Hotels
中插入任意数量的新列,无论您想插入到哪里。“[自动编号]是DBMS搜索到它要查找的内容所需的最少工作”-这取决于它要查找的内容!可能很适合查找单个自动编号值,但如果用户正在搜索自动编号值,则设计是错误的。如果用户搜索(例如)名称以字母“B”开头的所有酒店,则自动编号主键不是最好的,酒店名称作为PK会更好。您仍然可以使用酒店ID添加酒店和行程之间的关系-只需在行程中添加一个带“允许重复”的索引长fiedl“HotelID”-比链接到酒店名称要好得多感谢您的回复。对不起,我是一个新手,可能不懂-那么酒店ID不是行程字段上的数字吗?我不知道哪些自动编号对应于酒店名称为了回答您的问题,您的选项B是正确的选择!这是最安全和推荐的方法:)原因:你在用钥匙,除了钥匙什么都没有!:):)要使用Automnumber,您必须更改“行程表”中的列以显示Automnumber值,而不是酒店名称,然后更改“行程表”的插入和更新过程以首先在“酒店表”中查找Automnumber值。在酒店数量较少的高活动性环境中,整数PK/FK承诺的性能提升可能无法实现,也可能不值得更改您的程序。“保证唯一”-自动编号可以重新设定为1,以便新行生成重复。此外,还可以更新具有“自动编号”属性的列,以便有目的地创建重复项。你要求的担保是