gpt4 book ai didi

sql - 防止重复记录,创建新记录前查询

转载 作者:搜寻专家 更新时间:2023-10-30 20:19:16 25 4
gpt4 key购买 nike

设置:我正在创建一个 ms access 数据库来记录将由我自己和其他人完成的实验结果。我已经创建了一个表单和一个子表单;主窗体包含有关设备设置的字段,子窗体包含使用该设备设置的实验。主链接和子链接是 SettingID。

问题:尽管主 [settings] 表单中的字段仅限于组合框选择,但仍然存在大量设置组合。因此,当用户在表单中输入信息时,他们可能没有意识到具有相同设置的记录已经存在,并且由于 SettingID 是一个自动编号,它看起来是一个唯一的记录,而实际上它不是。

问题:我想对 BeforeInsert 事件运行查询,以检查在创建此记录之前是否存在具有相同设置的记录。如果记录不存在,则照常进行;如果确实存在,则提醒用户并将他们带到该记录。我不知道如何做到这一点。到目前为止,我为此所做的尝试并不值得一提,但我会继续尝试并弄清楚一些事情,直到有人回答这篇文章。

最佳答案

我相信您会想要两件事,具体取决于您希望界面的用户友好程度。

唯一索引

在设置表中的列上添加一个多列唯一索引,在这些列中,您不希望在另一行中重复它们的值组合。可以阅读 KFleschner 在您原始帖子的评论中提供的链接,或者查看此问题的第二个答案,其中包含与步骤相关的屏幕截图:Can we create multicolumn unique indexes on MS access databases? .这将不允许在设置表中出现重复项。

例如,如果您的设置和实验是针对计算机装备的,并且您有一个包含以下列的设置表:

设置ID、RAM_GB、CPU_GHz

那么您的主键将是 (SettingID),您的多列唯一索引将是 (RAM_GB, CPU_GHz),因为您只想要一条具有相同 RAM 容量和 CPU 速度的记录。

在数据库语言中,您的主键 SettingID 将是所谓的 surrogate key。 .新的多列唯一索引将是所谓的 natural key。 .两者都可用于标识唯一行,但主键(代理键)用于任何 foreign key 中。关系,例如 Experiments 表中的 SettingID。

这本身就可以防止重复问题,因为它将在数据库级别强制执行。但是,它不会自动使您的表单跳转到具有匹配自然键的记录。相反,Access 将通过一条消息提醒用户您输入的记录违反了索引。但仅此而已。用户将不得不取消新记录并自己寻找匹配的记录。

更新事件之前

Before Insert 事件在输入新记录的第一个字符时触发。参见 http://msdn.microsoft.com/en-us/library/office/ff835397.aspx了解详情。这太早了,您需要 Before Update 事件。并像这样向事件添加代码:

Private Sub Form_BeforeUpdate(Cancel As Integer)
Set rst = Me.RecordsetClone
rst.FindFirst "[SettingID] <> " & Me.SettingID & " AND [RAM_GB] = " & Me.RAM_GB & " AND [CPU_GHz] = " & Me.CPU_GHz
If Not rst.NoMatch Then
Cancel = True
If MsgBox("Setting already exist; goto existing record?", vbYesNo) = vbYes Then
Me.Undo
DoCmd.SearchForRecord , , acFirst, "[SettingID] = " & rst("SettingID")
End If
End If
rst.Close
End Sub

这段代码假设了一些事情:

  1. [RAM_GB][CPU_GHz] 是您的多列唯一索引的列。
  2. [SettingID] 是您的主键中的列。

根据您的需要调整列名称等,然后您还可以提示并自动导航到现有记录。

关于sql - 防止重复记录,创建新记录前查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14608052/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com