原始 KB 编号: 884185
症状
尝试在具有 自动编号 字段的表中插入新记录时,可能会收到以下错误消息:
由于将在索引、主键或关系中创建重复的值,请求对表的更改没有成功。 更改包含重复数据的字段中的数据,移除索引,或者重新定义索引以允许重复项,然后再试。
注意
表可能没有任何关系或任何索引。
原因
当 自动编号 字段的种子设定不正确时,会出现此问题。
解决方案
有多种方法可以解决此问题。
方法 1:执行压缩和修复
若要压缩数据库,请执行以下步骤:
启动 Access。
打开 Access 数据库。
注意
如果看到“安全警告”对话框,请单击“打开”。
单击“数据库工具”功能区选项卡,然后在“工具”组中单击“压缩和修复数据库”。
注意
以前版本的 Access 可能具有位于其他位置的“压缩和修复数据库”选项,请参阅特定版本的 Access 的文档以找到此选项。
若要手动重置 自动编号 字段种子,请使用以下方法之一。
方法 2:使用数据定义查询
在 Access 中打开表 (后端数据库) 的数据库:
在“创建”选项卡上,单击“查询”组中的“查询设计”。
在“ 显示表 ”对话框中,单击“ 关闭”。
在“设计”选项卡上,单击“结果”组中的“SQL 视图”。
在 Query1 窗口中键入以下内容:
ALTER TABLE TableName ALTER COLUMN AutoNumFieldName COUNTER(iMaxID,1);
注意
<TableName> 是表名称的 <占位符。AutoNumFieldName> 是 自动编号 字段名称的占位符。 iMaxID 是字段中当前最大值加 1 的占位符。
在“设计”选项卡上,单击“结果”组中的“运行”。
方法 3:运行Visual Basic for Applications代码
在“ 创建 ”选项卡上,单击“ 宏”下的向下箭头,然后单击“ 模块”。
将以下代码粘贴到 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> 表示表的名称。
在“运行”菜单上,单击“运行子/用户窗体”。
注意
在使用任一方法之前,必须关闭表。 成功使用任一方法后,无需保存查询或模块
重现行为的步骤
创建新的空白数据库
创建名为 Table1 的新表,其中包含以下两个字段:
Field1:自动编号 (主键) Field2:文本
将以下六条记录添加到 Table1。
Field1 Field2 1 A 2 B 3 C 4 D 5 E 6 F 删除 Field1 值为 3 的记录。
在“创建”选项卡上,单击“查询”组中的“查询设计”。
在“ 显示表 ”对话框中,单击“ 关闭”。
在“设计”选项卡上,单击“结果”组中的“SQL 视图”。
在 Query1 窗口中键入以下内容:
INSERT INTO Table1 (Field1, Field2) SELECT 3 AS Field1, "C" AS Field2;
在“设计”选项卡上,单击“结果”组中的“运行”。
打开 Table1,然后尝试添加新记录。 你会收到“症状”部分中提到的错误消息。