仅在Access 2007中不存在时添加记录

时间:2009-10-07 15:39:19

标签: sql ms-access

我有一张桌子,假设它存储了员工姓名(这不是确切的情况,但概念是相同的),主键设置为自动编号。添加新的工作人员时,我想在添加之前检查数据库中是否存在该名称,如果已存在则可能会出错。如何从表格的正常添加表单中执行此操作?

我尝试为它创建一个查询,但这不起作用,因为表单基于表,不能使用查询作为控件源。我在网上看到一些例子说如何使用VB代码做这样的事情,但是我无法让它工作,因为它不是一个简单的例子而且省略了一些线条。

有没有简单的方法可以做到这一点?

6 个答案:

答案 0 :(得分:2)

在表格设计视图中,您可以使名称列索引为无重复项

然后Access本身将拒绝该条目。但我认为它会在拒绝输入之前使用其中一个自动编号。

答案 1 :(得分:2)

在将记录插入数据库之前,您正在处理预先限定记录的问题。您将永远违反的简单绝对规则(永远不会允许使用相同名称的记录)可以通过数据库约束来处理 - 在这种情况下,在相关列上创建索引将AllowDuplicates设置为No。

然而,在现实世界中,资格预审通常更为复杂。您可能只需警告 可能副本的用户,但无论如何都允许他们添加记录。并且您可能需要针对特定​​条件检查其他表,或者一次收集多个表的信息。

在这些情况下,您需要编写接口,使其不直接绑定到表(在Access术语中,创建一个记录源为空的表单),在各种控件中收集信息,在代码中执行检查(通常使用DCOUNT和DLOOKUP),然后使用DoCmd.RunSQL在代码中发出一系列INSERT和UPDATE语句。

您可以偶尔使用一些技巧来解决前端编码问题,但是很快就会遇到需要这种级别编码的情况。

答案 2 :(得分:1)

我将投票放在使用未绑定表单来收集必填字段并显示可能重复的一面。以下是最近的应用程序中的示例:


(来源:dfenton.com

(我编辑了真人的名字并加入了伪造的东西,我的图形程序的抗锯齿与ClearType不同,因此很奇怪)

这里的想法是用户将数据放入四个字段中的任何一个(不要求所有这些字段)并单击ADD按钮。第一次,它填充可能的匹配。然后,用户必须决定其中一个匹配是否是预期的人,并再次单击添加(添加它,即使它是重复的),或者单击底部的按钮以转到所选客户。 / p>

彩色指示符旨在表达匹配的接近程度。在这种情况下,输入的电子邮件地址与列出的第一个人完全匹配,并且电子邮件本身的完全匹配被视为完全匹配。此外,在这个特定的应用程序中,客户希望最大限度地减少在同一家公司输入多个人(这是他们业务的性质),因此组织上的完全匹配被视为部分匹配。

除此之外,还有使用Soundex,Soundex2和Simil的匹配,以及与Soundex / Soundex2 / Simil结合的子串和子串。在这种情况下,第二个条目是副本,但是Soundex和Soundex2没有捕获它,而Simil返回67%的相似性,并且我将灵敏度设置为大于50%,因此“Wightman”显示为关闭与“怀特曼”相匹配。最后一个。我不确定为什么最后两个在列表中,但显然有一些原因(可能是Simil和缩写)。

我通过评分程序运行名称,公司和电子邮件,然后使用该组合计算最终得分。我将Soundex和Soundex2值存储在每个人的记录中。当然,Simil必须在运行中计算,但它可以正常运行,因为Jet / ACE查询优化器知道限制其他字段,因此调用Simil以获得大大减少的数据集(这实际上是第一个应用程序)我已经使用过Simil了,到目前为止效果很好。)

加载可能的匹配需要一点暂停,但速度不是非常慢(应用此版本的大约有8K现有记录正在测试)。我为人员表中有250K记录的应用程序创建了这个设计,当后端仍然是Jet时它运行得很好,并且在几年前后端升级到SQL Server之后仍然可以正常工作。

答案 3 :(得分:0)

最佳解决方案是让用户输入名字和姓氏的几个字符,并根据这些搜索条件显示所有个人的连续形式。还显示相关信息,如中间名,如果可用,电话号码和地址,以清除可能的重复项。然后,如果找不到副本,那么他们可以添加该人。

每个城镇都会有两个约翰史密斯或简琼斯。

我读到的情况是,两名姓氏相同,姓名和出生日期相同的妇女都住在医院。真的很可怕。

答案 4 :(得分:0)

这在SQL世界中称为“UPSERT”。 ISO / ANSI SQL-99标准定义了MERGE语法,该语法最近被添加到SQL Server 2008中,并带有标准的专有扩展。令人高兴的是,这是SQL世界的发展方式,跟随MySQL开辟的道路。

可悲的是,Access数据库引擎是一个完全不同的故事。即使简单的UPDATE也不支持SQL-92标量子查询语法,而是拥有自己的专有(任意(不可预测的)肯定未记录的)结果。 Windows团队试图在Jet 4.0中修复SQL Server的尝试。即使现在Access团队有自己的ACE格式,他们似乎对更改SQL语法不感兴趣。因此,他们有可能拥有标准SQL-99的产品 - 甚至是他们自己的替代方案 - 构造非常遥远:(

一个明显的解决方法,假设性能不是问题(一如既往,需要测试),是执行INSERT,忽略任何关键失败错误,然后立即执行UPDATE。即使你是(IMO高度可疑的)“每张桌子上的自动编号PK”,你的自然键也应该有一个独特的键,所以一切都应该没问题。

答案 5 :(得分:0)

感谢此处的所有信息。这是很好的信息,我会用它,因为我是自学成才。

我在这里提到的最简单的方法是在我想要的所有字段上使用索引(没有重复)。这里的诀窍是使用多个索引(这基本上允许复合索引,或由多个字段组成的“虚拟”索引)。

可以在此处找到该方法:http://en.allexperts.com/q/Using-MS-Access-1440/Creating-Unique-Value-check.htm,但如果链接被删除,我会重复此方法。

来自Access帮助: 防止将重复值输入字段组合

使用要禁止重复值的字段创建多字段索引。完成索引定义后,将“索引”窗口保持打开状态。

如何?

  1. 在“设计”视图中打开表格。
  2. 点击工具栏上的索引。
  3. 索引中的第一个空白行 名称列,键入名称 指数。您可以在之后命名索引 其中一个索引字段,或使用 另一个名字。
  4. 在“字段名称”列中,单击 箭头并选择第一个字段 索引。
  5. 在“字段名称”的下一行中 列,选择第二个字段 指数。 (保留索引名称 该行中的列空白。)重复 这一步直到你选择了 您要包含的所有字段 在这个指数中。默认排序顺序是 上升。选择降序 “索引”的“排序顺序”列 窗口来排序相应的 字段的数据按降序排列。
  6. 在索引的上半部分 窗口,单击新索引名称。
  7. 在索引的下半部分 窗口,单击Unique属性 框,然后单击是。
  8. 您现在应该无法输入索引中具有相同值的记录。我遇到了问题,如果其中一个索引字段有空格我仍然可以输入值(在设置索引时有一个选项可以检查/忽略空值)但它对我不起作用,但解决方案有效,因为无论如何我都不会有空值。