我有一个MS Access DB,在父表和其他82个表上有一个主键。 新数据将带有主键的新名称
Before New
RS182 X182RS
RS188 X188RS
RD301 X301RD
是否有办法在数据库中的所有表上批量重命名主键值,因为我想将所有以前的历史数据与新名称值相关联。
答案 0 :(得分:1)
编码并不难,至少如果我从你的问题中理解以下内容是正确的:
ID
)要获取数据库中所有表的列表,您可以查看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
所以这里的诀窍是暂时修改所有这些关系(我认为它们存在并启用了参照完整性 - 否则我甚至不会和你说话:),并启用级联更新选项。
一旦您的数据重新生成,请不要忘记关闭该选项!