将任意值插入自动编号列
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 中打开数据库,然后 运行 对其执行“压缩和修复数据库”操作。
我有一个 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 中打开数据库,然后 运行 对其执行“压缩和修复数据库”操作。