我有两个相同的数据库,结构相同,数据库a在计算机a中,数据库b在计算机b中。
数据库a ****(a.accdb)****和数据库b ****(b.accdb)****的数据不同。然后在数据库中我有例如ID:1,2,3,在数据库B中我有ID:4,5,6
然后我需要在一个数据库中合并这些数据库数据(a或b,无所谓),所以最终的数据库看起来像。 ID:1,2,3,4,5,6
我搜索一个简单的方法来做到这一点。因为我有很多桌子。通过联合查询执行此操作非常繁琐。
我只搜索没有方案的数据的备份选项,例如postgreSQl或许多其他RDBMS,但我在访问2007中没有看到这个选项。
pd:只有表可能有重复值(我猜pk不允许复制重复值,所有其他值都将被复制好)。如果我错了,请纠正我。
感谢您的帮助。
答案 0 :(得分:3)
如果你有一个表,tblFoo,在两个数据库中具有相同的结构,你可以尝试将一个表的内容附加到另一个表中。所以打开a.accdb:
INSERT INTO tblFoo
SELECT *
FROM tblFoo IN 'C:\YourPath\b.accdb';
实际上我怀疑这种方法对你有用,因为你提到了主键和重复。也许你会更好地将来自tblFoo的两个副本的内容附加到第三个表tblFooMaster中,该表没有任何主键或唯一约束。在这种情况下,你必须弄清楚你想用tblFooMaster中的重复项做什么。
我希望您在尝试任何形式的合并之前备份这两个数据库。
修改:如果该方法令人满意,则无需为每个表创建查询。使用VBA为您构建和执行查询。
Public Sub ImportTableData(ByVal pstrTable As String, _
ByVal pstrDb As String)
Dim strSql As String
strSql = "INSERT INTO " & pstrTable & vbNewLine & _
"SELECT *" & vbNewLine & _
"FROM " & pstrTable & " IN '" & pstrDb & "';"
'caller will handle errors '
CurrentDb.Execute strSql, dbFailOnError
End Sub
由于您希望将表传输作为单个操作进行,因此您可以使用另一个VBA过程将表名提供给ImportTableData过程。
Public Sub ImportAllTables()
Const cstrDb As String = "C:\YourPath\b.accdb"
Dim tdf As TableDef
Dim strMsg As String
On Error GoTo ErrorHandler
For Each tdf In CurrentDb.TableDefs
'ignore system and temporary tables '
If Not (tdf.Name Like "MSys*" Or _
tdf.Name Like "~*") Then
Call ImportTableData(tdf.Name, cstrDb)
End If
Next tdf
ExitHere:
On Error GoTo 0
Set tdf = Nothing
Exit Sub
ErrorHandler:
Select Case Err.Number
Case 3078
strMsg = "Input table " & tdf.Name & " not found."
MsgBox strMsg
Resume Next
Case Else
strMsg = "Error " & Err.Number & " (" & Err.Description _
& ") in procedure ImportAllTables"
MsgBox strMsg
GoTo ExitHere
End Select
End Sub