将任意值插入自动编号列

Insert arbitrary value into an AutoNumber column

我有一个 Access 数据库。我的前端依赖于一个 table 中的特定记录。 ID 列的值必须为 1.

但该列的类型为 AutoNumber。我无法创建具有特定 ID.

的记录

我尝试了所有方法,从删除关系、键和将数据类型更改为普通数字类型。

但即使我随后创建了 ID=1 的记录,我也无法将列数据类型改回 AutoNumber

这有可能吗?

如果您能够删除关系并且没有其他表依赖于 ID,您可以使用以下代码重置 ID。

Sub specificRecord()

    Dim db As Database
    Set db = CurrentDb
    
    'Export/Copy data in another table
    Dim sSQL As String
    sSQL = "SELECT * INTO tblCopy FROM tblSource;"   ' Make sure tblCopy does not exist otherwise you get an error
    db.Execute sSQL

    'Delete data in source table
    sSQL = "DELETE * FROM tblSource"
    db.Execute sSQL

    'Reset ID to 1 (Modify the ID field accordingly!)
    sSQL = "ALTER TABLE tblSource ALTER COLUMN ID COUNTER(1,1);"
    db.Execute sSQL
    
    ' Import specific record into table
    ' You need to modify this step you as I do not know the field names
    ' And you have to leave out the ID field
    
    ' INSERT INTO table_name (column1, column2, column3, ...)
    ' VALUES (value1, value2, value3, ...);
    sSQL = "INSERT INTO tblSource (Test,Datum) VALUES ('xxx','01.05.2022');"
    db.Execute sSQL

    ' Import/Copy data from backup table to source table
    ' INSERT INTO tblSource column1, column1, column3, ...)
    ' SELECT tblCopy.column1, tblCopy.column1
    ' FROM tblCopy;
    
    ' see above, again leave out the ID field
    sSQL = "INSERT INTO tblSource (Test, Datum) SELECT tblCopy.Test, tblCopy.Datum FROM tblCopy;"
    db.Execute sSQL

    ' Application.RefreshDatabaseWindow
End Sub

使用风险自负,并在 运行 此代码之前备份您的数据库,以防万一。

如果你的自动编号有意义,那么你迟早会遇到麻烦。

进一步reading。如果您在其他表中有相关​​记录,您还可以在那里找到如何继续的描述

更新: 在这种情况下,Gord Thompson 的方法更好。该方法中唯一剩下的步骤是将 AutoID 字段重置为正确的字段,否则访问引擎将使用 2 作为下一个自动确定的 AutoId。以下代码将执行此操作

Sub resetMaxID()

    Dim db As Database
    Dim rs As Recordset
    Dim sSQL As String
    
    Set db = CurrentDb
    sSQL = "SELECT MAX(ID) FROM tblSource"
    Set rs = db.OpenRecordset(sSQL)
    
    Dim maxID As Long
    maxID = rs.Fields(0).Value  ' This is the max AutoId
    rs.Close
    
    'Reset ID to maxId +1
    sSQL = "ALTER TABLE tblSource ALTER COLUMN ID COUNTER(" & maxID + 1 & ",1);"
    db.Execute sSQL

End Sub

But the column is of type AutoNumber. I cannot create a record with a specific ID.

其实那不是真的。 Access 数据库引擎允许我们将任意值插入自动编号字段。下面是Python,但是很能说明问题:

table_name = "so71884564"

if crsr.tables(table_name).fetchone():  # does table exist?
    crsr.execute(f"DROP TABLE {table_name}")
crsr.execute(f"CREATE TABLE {table_name} (id COUNTER PRIMARY KEY, txt TEXT(50))")

# insert arbitrary id
crsr.execute(f"INSERT INTO {table_name} (id, txt) VALUES (2, 'bar')")
print(crsr.execute(f"SELECT * FROM {table_name}").fetchall())
# [(2, 'bar')]

# let the Access Database Engine autonumber this one
crsr.execute(f"INSERT INTO {table_name} (txt) VALUES ('baz')")
print(crsr.execute(f"SELECT * FROM {table_name}").fetchall())
# [(2, 'bar'), (3, 'baz')]

# insert the missing row for id=1
crsr.execute(f"INSERT INTO {table_name} (id, txt) VALUES (1, 'foo')")
print(crsr.execute(f"SELECT * FROM {table_name}").fetchall())
# [(2, 'bar'), (3, 'baz'), (1, 'foo')]

编辑:

感谢@Storax 提到,如果我们将 n 插入,Access 数据库引擎会将下一个自动编号值重置为 n + 1 table。如果 n 大于现有的最大自动编号值,那没关系,但如果我们使用“back-fill”值,如 id=1[=,则可能会导致错误27=] 当 id=2 已经存在时。

正确重置下一个自动编号值的最简单方法是在 MSACCESS.EXE 中打开数据库,然后 运行 对其执行“压缩和修复数据库”操作。