我们可以在 MS 访问数据库上创建多列唯一索引吗?

Posted

技术标签:

【中文标题】我们可以在 MS 访问数据库上创建多列唯一索引吗?【英文标题】:Can we create multicolumn unique indexes on MS access databases? 【发布时间】:2011-01-08 19:41:08 【问题描述】:

我们希望使用多列唯一索引来防止我们的 MS 访问数据库中的记录重复。由于数据的发送方式(通过网络),有时会收到重复的数据。数据源不发送唯一 ID,因此最简单的选择是防止插入重复记录。

根据Unique Index Design Guidelines:

使用多列唯一索引, 索引保证每个组合 索引键中的值是唯一的。 例如,如果唯一索引是 在 LastName 的组合上创建, FirstName 和 MiddleName 列,无 表中的两行可能有 这些值的相同组合 列。

这是针对 SQL 2005 的,所以我不确定是否可以使用 MS 访问。

我想另一种选择可能是使用查询(伪代码):

insert into foobar (a, b, c) values ('x', 'y', 'z')
where (a <> 'x') and (b <> 'y') and (c <> 'z')

...但我觉得索引会更好。

【问题讨论】:

为什么不给有问题的表一个唯一索引?我不明白这与 C++ 有什么关系,顺便说一句。 否 - 任何索引都可以在多个列上创建 - 如果不是这种情况,索引将毫无用处。这就是为什么我说你需要一些帮助 - 你似乎不了解数据库设计的基础知识。 Neil,您能解释一下如何使用 MS 访问在多个列上创建索引吗?这会很有帮助。 啊哈,我相信我要搜索的术语是“多列唯一索引”。我以前从未使用过这些......也许这个答案会有所帮助:***.com/questions/179085/… 问题已更新 - 希望这应该更清楚我所追求的。 【参考方案1】:

原来你可以在 MS access 数据库上创建一个多列唯一索引,但是如果你想通过 GUI 来做这件事有点疯狂。还有一个限制;每个索引只能使用 10 列。

无论如何,下面是在 MS access 数据库上创建多列唯一索引的方法。

    在设计模式下打开表格,Design,选择Indexes。 创建一个新行并在索引名称单元格中输入一个值, 从下拉菜单中选择第一列。 添加一个新行并将索引名称单元格留空。 选择第二列,依此类推。

它应该是这样的:

【讨论】:

嗯,由于某种原因,这使得 Foo 本身是独一无二的,而不是与 FooBar 等结合使用。我只需要允许 ("a", "b", "c", "d") 一次,但是也允许("x", "b", "c", "d")——而且这种索引排列似乎不允许这样做,因为最后 3 个值已经存在。 @Remou 为您提供了一种更简单的方法,即选择多行并点击工具栏上的 PK 按钮。这对我来说似乎很直观,因为它是设置任何主键的 GUI 方式。 @David-W-Fenton 是的,就像 Remou 说的那样。 哈,请放弃我的第一条评论!我今天又试了一次,它按预期工作。不太确定我昨天做错了什么。【参考方案2】:

在 MS Access 的设计视图中打开表格,选择要设为唯一索引的三列,然后单击工具栏上的小键。主键(集)中不能有空值。

【讨论】:

Null 问题至关重要——如果任何字段都可以为 Null,那么您就不能在索引上强制执行唯一性(因为没有两个 Null 是相等的,两条记录具有 5 个相同的字段和两者中的第 6 个字段 Null 不会被视为重复)。 这个答案是对的。但是有人应该告诉尼克,他真正在寻找的是唯一的约束,而不是唯一的索引。如果他创建了一个多列 PK 约束,他将获得一个多列唯一索引。但索引只是一个工具。他正在寻找的逻辑特征是约束。 @Walter Mitty 我认为你是对的 - 请参阅我的回答中的评论。 Access 中无法通过 UI 创建 UNIQUE 约束——只能通过 DAO 或 DDL 完成。 这是在 MSAccess 中创建主键的方法......它是一个唯一索引,但不是在任何字段上创建唯一索引的方法。如果您不需要其他任何主键,这可以解决单个唯一索引的问题。但@Ilmari Karonen 的回答更重要。【参考方案3】:

我们可以使多个数据成为唯一数据,而无需将它们设置为主键。

注意:表中只有1条数据可以为主键)

将数据值设置为唯一数据的步骤(对于MS ACCESS 2007 - 2010

    设计视图中打开选定的表格 点击(突出显示)您希望设置为唯一的特定列/属性 在表格底部,您将看到该特定列的“索引属性” 找到“Indexed”列,目前Indexed文本框中的数据为“No”,点击文本框末尾更改数据,选择“Yes(No Duplicates)

真心希望这些方法可以帮助到大家! :)

【讨论】:

这仅适用于单列。问题是关于多列的。 @Andre451 您可以将此方法用于多列 Andre。只需为您希望设置为唯一的每一列设置此方法。您是否尝试设置多个列?因为这是我的工作。 是的,当然你可以为多个列分别设置唯一索引。但问题是关于设置一个涵盖多列的唯一索引。【参考方案4】:

我遇到了 Nick Bolton 上面报告的问题。将 2 个字段 (Foo, Bar) 设置为 PK 将 Foo 设置为唯一,而我只希望 Foo + Bar 的组合是唯一的。

问题原来是我创建了与另一个表的 1:1 关系,并在 Foo 上链接。我删除了关系,按照我想要的方式设置了 2-field PK,然后恢复了关系,它可以正常工作。

【讨论】:

【参考方案5】:

我发现的一个技巧是,为了让 2 列主键(在父表中)成为子表的 2(FK)+n 主键,首先选择索引属性作为 FISRT 键属性然后将未索引的属性作为“修改关系对话框”@Relations 窗口中的第二个键属性。

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。【参考方案6】:

它将作为 Ms Access 2007/2010 中的唯一键

【讨论】:

以上是关于我们可以在 MS 访问数据库上创建多列唯一索引吗?的主要内容,如果未能解决你的问题,请参考以下文章

mysql数据库索引

索引的优缺点,何时用或不用索引

MySQL索引

Mysql添加索引及索引的优缺点

Mysql运维管理-创建索引知识及创建索引的多种方法实战9

由于多列上的唯一索引,无法更新 Rails 中的父记录和嵌套记录