将现有mdb中的数据附加到另一个现有mdb中

时间:2011-04-11 22:27:19

标签: database-design ms-access ms-access-2007

我正在升级现有的前端和后端mdbs集。后端变得臃肿并影响性能。仍需要保留两年以上的数据,但实际上不可能再次访问。我的想法是,有一个活跃的后端(即,只有当前和前一年的数据)和一个存档的后端(即,在每年年初,附加来自活动的所有数据)是合适的。后端进入现有的归档后端)。

  • 我应该考虑哪些其他方法?
  • 如果这是一种合适的方法,如何将活动后端mdb中的所有数据附加到归档后端,最好是从前端(例如,启动函数)?
    • 我能够识别的唯一方法是进入归档后端,从活动后端导入每个表,然后执行追加。有没有办法从前端完成所有这些?

1 个答案:

答案 0 :(得分:2)

你提到腹胀。如果您还没有,请在膨胀的后端MDB上运行Compact和Repair。除了缩小文件大小外,它还将更新索引统计信息,这可以使查询优化器更好地决定您的查询计划。

您没有提供有关现有数据库和表格的详细信息,因此我做了几个简化的假设。

  1. 您的前端MDB包含指向要存档的后端MDB中所有表的链接。
  2. 所有前端链接都只是指向这些表的链接。 (IOW,没有指向您不想存档的表的链接。
  3. 链接名称与后端mdb中的表名匹配。
  4. 您的表格都包含名为“date_field”的日期字段。 (这是其值将用于确定哪些记录被归档的字段。)
  5. 您已创建存档数据库C:\ db \ archive.mdb,其中包含要存档的所有表的空副本。您可能希望将自动编号字段转换为长整数。此外,如果您没有预料到归档数据几乎不会被使用,您可以删除所有索引(包括主键,唯一约束和关系)......如果您关心,可能会节省大量空间...但当您没有要更新的索引时,插入数据也会快得多。
  6. 因此,我建议您制作后端数据库的副本,然后尝试使用此过程。查看立即窗口以检查INSERT和DELETE语句。如果它们看起来合理,则取消注释两个CurrentDb.Execute行,看看会发生什么。 (你先做个备份吧?)

    Public Sub DoArchive()
        Const cstrArchive As String = "C:\db\archive.mdb"
        Dim db As DAO.Database
        Dim tdf As DAO.TableDef
        Dim strAppend As String
        Dim strCutoff As String
        Dim strDelete As String
        Dim strWhere As String
        Dim strMsg As String
    
    On Error GoTo ErrorHandler
    
        Set db = CurrentDb
        strCutoff = "#" & Year(Date) - 1 & "/01/01#"
        strWhere = " WHERE date_field < " & strCutoff
        For Each tdf In db.TableDefs
            If Len(tdf.Connect) > 0 Then
                strAppend = "INSERT INTO [" & tdf.name & "] IN '" & _
                    cstrArchive & "' SELECT * FROM [" & tdf.name & _
                    "]" & strWhere & ";"
                Debug.Print strAppend
                ''CurrentDb.Execute strAppend, dbFailOnError
                strDelete = "DELETE FROM [" & tdf.name & "]" & _
                    strWhere & ";"
                Debug.Print strDelete
                ''CurrentDb.Execute strDelete, dbFailOnError
            End If
        Next tdf
    
    ExitHere:
        On Error GoTo 0
        Set tdf = Nothing
        Set db = Nothing
        Exit Sub
    
    ErrorHandler:
        strMsg = "Error " & Err.Number & " (" & Err.description _
            & ") in procedure DoArchive"
        MsgBox strMsg
        GoTo ExitHere
    End Sub