如何重命名Access DB中的主键值

时间:2012-02-22 15:22:33

标签: ms-access key rename

我有一个MS Access DB,在父表和其他82个表上有一个主键。 新数据将带有主键的新名称

Before      New
RS182       X182RS
RS188       X188RS
RD301       X301RD

是否有办法在数据库中的所有表上批量重命名主键值,因为我想将所有以前的历史数据与新名称值相关联。

3 个答案:

答案 0 :(得分:1)

编码并不难,至少如果我从你的问题中理解以下内容是正确的:

  • 每个表中都存在主键列
  • 它在每个表中都有相同的名称(我将在我的示例中使用ID
  • 现有值的格式相同(“RS182” - >两个字母和三个数字)

要获取数据库中所有表的列表,您可以查看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

答案 1 :(得分:1)

基于该示例,似乎新旧主键值之间存在一致的模式。

? "X" & Right("RS182", 3) & Left("RS182", 2)
X182RS 

如果确实如此,则使用一系列UPDATE语句将旧值替换为new。但首先要制作数据库的备份副本以便妥善保管。

例如,如果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公开的任何问题添加错误处理程序。

答案 2 :(得分:1)

如果您在其他表中有相关​​记录,则无法修改PK 所以这里的诀窍是暂时修改所有这些关系(我认为它们存在并启用了参照完整性 - 否则我甚至不会和你说话:),并启用级联更新选项。
一旦您的数据重新生成,请不要忘记关闭该选项!