尝试在 Access 中包含自动编号字段的表中插入新记录时,可能会收到错误消息

原始 KB 编号: 884185

症状

尝试在具有 自动编号 字段的表中插入新记录时,可能会收到以下错误消息:

由于将在索引、主键或关系中创建重复的值,请求对表的更改没有成功。 更改包含重复数据的字段中的数据,移除索引,或者重新定义索引以允许重复项,然后再试。

在表中插入新记录后错误消息的屏幕截图。

注意

表可能没有任何关系或任何索引。

原因

自动编号 字段的种子设定不正确时,会出现此问题。

解决方案

有多种方法可以解决此问题。

方法 1:执行压缩和修复

若要压缩数据库,请执行以下步骤:

  1. 启动 Access。

  2. 打开 Access 数据库。

    注意

    如果看到“安全警告”对话框,请单击“打开”。

  3. 单击“数据库工具”功能区选项卡,然后在“工具”组中单击“压缩和修复数据库”。

    注意

    以前版本的 Access 可能具有位于其他位置的“压缩和修复数据库”选项,请参阅特定版本的 Access 的文档以找到此选项。

若要手动重置 自动编号 字段种子,请使用以下方法之一。

方法 2:使用数据定义查询

在 Access 中打开表 (后端数据库) 的数据库:

  1. 在“创建”选项卡上,单击“查询”组中的“查询设计”。

  2. 在“ 显示表 ”对话框中,单击“ 关闭”。

  3. 在“设计”选项卡上,单击“结果”组中的“SQL 视图”。

  4. Query1 窗口中键入以下内容:

    ALTER TABLE TableName ALTER COLUMN AutoNumFieldName COUNTER(iMaxID,1);
    

    注意

    <TableName> 是表名称的 <占位符。AutoNumFieldName> 是 自动编号 字段名称的占位符。 iMaxID 是字段中当前最大值加 1 的占位符。

  5. 在“设计”选项卡上,单击“结果”组中的“运行”。

方法 3:运行Visual Basic for Applications代码

  1. 在“ 创建 ”选项卡上,单击“ ”下的向下箭头,然后单击“ 模块”。

  2. 将以下代码粘贴到 Visual Basic 编辑器。

    Sub ResetAuto()
      Dim iMaxID As Long
      Dim sqlFixID As String
      iMaxID = DMax("<AutonumberFieldName>", "<TableName>") + 1
      sqlFixID = "ALTER TABLE <TableName> ALTER COLUMN <AutonumberFieldName> COUNTER(" & <iMaxID> & ",1)"
      DoCmd.RunSQL sqlFixID
    End Sub
    

    注意

    占位符 <AutonumberFieldName> 表示自动编号字段的名称。 占位符 <TableName> 表示表的名称。

  3. 在“运行”菜单上,单击“运行子/用户窗体”。

    注意

    在使用任一方法之前,必须关闭表。 成功使用任一方法后,无需保存查询或模块

重现行为的步骤

  1. 创建新的空白数据库

  2. 创建名为 Table1 的新表,其中包含以下两个字段:

    Field1:自动编号 (主键) Field2:文本

  3. 将以下六条记录添加到 Table1。

    Field1 Field2
    1 A
    2 B
    3 C
    4 D
    5 E
    6 F
  4. 删除 Field1 值为 3 的记录。

  5. 在“创建”选项卡上,单击“查询”组中的“查询设计”。

  6. 在“ 显示表 ”对话框中,单击“ 关闭”。

  7. 在“设计”选项卡上,单击“结果”组中的“SQL 视图”。

  8. Query1 窗口中键入以下内容:

    INSERT INTO Table1 (Field1, Field2) SELECT 3 AS Field1, "C" AS Field2;
    
  9. 在“设计”选项卡上,单击“结果”组中的“运行”。

  10. 打开 Table1,然后尝试添加新记录。 你会收到“症状”部分中提到的错误消息。