我们可以在 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
本身是独一无二的,而不是与 Foo
、Bar
等结合使用。我只需要允许 ("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 访问数据库上创建多列唯一索引吗?的主要内容,如果未能解决你的问题,请参考以下文章