我有一個 Access 資料庫。我的前端取決于一個表中的特定記錄。該ID列必須具有值1。
但是該列是 type AutoNumber。我無法使用特定的ID.
我嘗試了從洗掉關系、鍵和將資料型別更改為普通數字型別的所有方法。
但即使我隨后創建了一條記錄,ID=1我也無法將列資料型別改回AutoNumber.
這甚至有可能嗎?
uj5u.com熱心網友回復:
但該列的型別為自動編號。我無法創建具有特定 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 。如果n大于最大的現有自動編號值,那沒關系,但如果我們在id=2已經存在時“回填”像id=1這樣的值,則會導致錯誤。
正確重置下一個自動編號值的最簡單方法是在 MSACCESS.EXE 中打開資料庫并對其運行“壓縮和修復資料庫”操作。
uj5u.com熱心網友回復:
如果您能夠洗掉關系并且沒有其他表依賴于 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
為了安全起見,請自行承擔風險并在運行此代碼之前備份資料庫。
如果您的自動編號有意義,那么您遲早會遇到麻煩。
進一步閱讀。如果您在其他表中有相關??記錄,您還可以在此處找到如何進行的說明
更新: 在這種情況下,戈德湯普森的方法是更好的方法。該應用程式中唯一剩下的步驟是將 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
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/459697.html
