访问:将数据插入具有外键关系的两个表中

时间:2014-03-26 19:26:17

标签: sql vba ms-access

为了扩展,我创建了一个我的问题的例子来复制我的问题。

我们说我有3张桌子:

| PID      | PName | City  |
 Autonumber  Text    Text

购买

|PurchaseNo | PID  | Item |
 Autonumber  Number  Text

导入

|Pname| City | Item
 Text   Text   Text

因此,人与购买表基本上有一对多的关系,每个人可以进行1对多的购买。 PID是Person的PK,同时是Purchase表的FK。因此,如果我直接进行数据输入,那么事情就没问题了。但数据每天早上都有,我必须导入它。它以Import表格的形式出现,其格式与我所显示的格式相同。

所以我的问题是如何将导入数据表分发到两个表,同时保持其1对多关系的完整性。

我采取的一种方法是尝试使用@@ identity,这是我在vba中使用的代码:

 Option Compare Database

Public Sub IMPORTRE()

  On Error GoTo errHandler
    Dim wrk As DAO.Workspace
    Dim db As DAO.Database
    Dim lngInvoiceID As Long

    Set wrk = DBEngine.Workspaces(0)
    Set db = wrk.OpenDatabase(CurrentDb.Name)
    With wrk
      .BeginTrans
      db.Execute "INSERT INTO Person SELECT PName,City FROM Import", dbFailOnError
      lngInvoiceID = db.OpenRecordset("SELECT @@IDENTITY")(0)
      db.Execute "INSERT INTO Purchase SELECT " & lngInvoiceID & " As PID, Item FROM Import ", dbFailOnError
      .CommitTrans
      Debug.Print "Inserted Invoice header and detail for Invoice " & lngInvoiceID
    End With

exitRoutine:
    If Not (db Is Nothing) Then
       db.Close
       Set db = Nothing
    End If
    Set wrk = Nothing
    Exit Sub

errHandler:
    MsgBox Err.Number & ": " & Err.Description, vbExclamation, "Error in transaction"
    wrk.Rollback
    Resume exitRoutine

End Sub

除了一件事之外,哪个工作得很好和花花公子。 PID将始终是导入的最后一个值。

所以我的问题是,我该如何解决这个问题。这是我的代码吗?或者我复杂化了一个简单的问题?重申一下,我想要做的是将导入表中的数据插入到两个具有外键关系的表中。

1 个答案:

答案 0 :(得分:0)

假设您的名字是唯一的,您可以使用2个查询执行此操作。第一个从导入表中插入人Person表中尚不存在的人。

INSERT INTO Person ( PName, City )
SELECT PName, City
FROM Import
WHERE not Exists (Select PName, City from Person WHERE PName = Import.PName);

对于第二个查询,您需要使用联接。这将允许您在一个语句中一起获取现有用户和项目的PID。

INSERT INTO Purchase ( PID, Item )
SELECT Person.PID, Import.Item
FROM Import INNER JOIN Person ON Import.PName = Person.PName;