2012-02-22 30 views
2

我有一個MS Access數據庫與父表上的主鍵和82個其他表。 新的數據將被新的名稱來作爲主鍵如何重命名訪問數據庫中的主鍵值

Before  New 
RS182  X182RS 
RS188  X188RS 
RD301  X301RD 

有沒有辦法來對數據庫中的所有表重命名批量的主鍵值,因爲我想所有以前的歷史數據的關聯新的名字值。

回答

1

這不是很難代碼,至少如果我瞭解以下正確的從你的問題:

  • 主鍵列在每個表
  • 存在,它在每個表相同的名稱(我「會在我的例子中使用ID
  • 現有的值都相同的格式(‘RS182’ - >兩個字母和三個數字)

爲了讓你的所有表的列表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 
+0

SetWarnings off ==非常糟糕! – HansUp 2012-02-22 20:55:37

+0

@HansUp:之前從來沒有想過......只是用它搜索並找到[this](http://www.granite.ab.ca/access/bestpractices.htm)。這是唯一的原因還是有更多? – 2012-02-22 21:05:00

+0

我非常同意Tony在該頁面上對此的評價。我想補充一點,關掉SetWarnings是不好的,因爲它會壓制信息。考慮這個堆棧溢出問題,其中SetWarnings關閉是一個有效的故障排除的巨大障礙:http://stackoverflow.com/questions/7115247/does-ms-access-suppress-primary-key-violations-on-inserts – HansUp 2012-02-22 21:16:07

1

基礎上樣品,似乎還有新老主鍵值之間的統一的模式。

? "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公開的任何問題添加一個錯誤處理程序。

1

如果在其他表中有相關​​記錄,則不能修改PK。
所以這裏的訣竅是暫時修改所有這些關係(我認爲它們存在並且啓用了參照完整性 - 否則我甚至不會和你說話:),並啓用Cascade Update選項。
不要忘記一旦你的數據返回產品就關閉該選項!