我有一個MS Access數據庫與父表上的主鍵和82個其他表。 新的數據將被新的名稱來作爲主鍵如何重命名訪問數據庫中的主鍵值
Before New
RS182 X182RS
RS188 X188RS
RD301 X301RD
有沒有辦法來對數據庫中的所有表重命名批量的主鍵值,因爲我想所有以前的歷史數據的關聯新的名字值。
我有一個MS Access數據庫與父表上的主鍵和82個其他表。 新的數據將被新的名稱來作爲主鍵如何重命名訪問數據庫中的主鍵值
Before New
RS182 X182RS
RS188 X188RS
RD301 X301RD
有沒有辦法來對數據庫中的所有表重命名批量的主鍵值,因爲我想所有以前的歷史數據的關聯新的名字值。
這不是很難代碼,至少如果我瞭解以下正確的從你的問題:
ID
)爲了讓你的所有表的列表r數據庫,你可以看看hidden table MSysObjects
。
然後你只需要遍歷表格並更新ID
列。
一個簡單的例子(工作在我的機器上):
Public Function Test()
Dim RS As DAO.Recordset
Dim SQL As String
SQL = "select name from msysobjects where type = 1 and name not like 'msys*'"
Set RS = CurrentDb.OpenRecordset(SQL)
Do While Not RS.EOF
SQL = "update " & RS("name") & " set ID = 'X' & Mid([ID],3) & Left([ID],2);"
CurrentDb.Execute SQL, dbFailOnError
RS.MoveNext
Loop
RS.Close
Set RS = Nothing
End Function
基礎上樣品,似乎還有新老主鍵值之間的統一的模式。
? "X" & Right("RS182", 3) & Left("RS182", 2)
X182RS
如果這是真的,那麼使用一系列的UPDATE語句來替換舊的值與新的。但首先製作數據庫的備份副本以便妥善保管。
例如,如果對於YourTable主鍵字段被命名爲ID:
UPDATE YourTable
Set ID = "X" & Right(ID, 3) & Left(ID, 2);
如果YourTable被包括在任何定義的關係,首先需要刪除那些關係(或至少取消選中「執行參照完整性「選項),然後在更新主鍵值後恢復關係。
從ID中刪除主鍵屬性應允許更快地完成UPDATE。之後重新分配主鍵。
由於您有82個需要此轉換的表,您可以創建一個VBA過程來完成此操作。
Public Sub ConvertPKeyValues(ByVal pTable As String, _
ByVal pField As String)
Dim db As DAO.Database
Dim strSql As String
strSql = "UPDATE [" & pTable & "]" & vbCrLf & _
"Set [" & pField & "] = 'X' & " & _
"Right([" & pField & "], 3) & " & _
"Left([" & pField & "], 2);"
Set db = CurrentDb
db.Execute strSql, dbFailOnError
Set db = Nothing
End Sub
用每個表名稱和該表中相關字段的名稱調用過程。您還應該爲dbFailOnError公開的任何問題添加一個錯誤處理程序。
如果在其他表中有相關記錄,則不能修改PK。
所以這裏的訣竅是暫時修改所有這些關係(我認爲它們存在並且啓用了參照完整性 - 否則我甚至不會和你說話:),並啓用Cascade Update選項。
不要忘記一旦你的數據返回產品就關閉該選項!
SetWarnings off ==非常糟糕! – HansUp 2012-02-22 20:55:37
@HansUp:之前從來沒有想過......只是用它搜索並找到[this](http://www.granite.ab.ca/access/bestpractices.htm)。這是唯一的原因還是有更多? – 2012-02-22 21:05:00
我非常同意Tony在該頁面上對此的評價。我想補充一點,關掉SetWarnings是不好的,因爲它會壓制信息。考慮這個堆棧溢出問題,其中SetWarnings關閉是一個有效的故障排除的巨大障礙:http://stackoverflow.com/questions/7115247/does-ms-access-suppress-primary-key-violations-on-inserts – HansUp 2012-02-22 21:16:07