2014-03-26 59 views
1

爲了規模化,我創建了一個用於複製我的問題的示例。訪問:將數據插入到具有外鍵關係的兩個表中

比方說,我有3個表:

| PID  | PName | City | 
Autonumber Text Text 

購買

|PurchaseNo | PID | Item | 
Autonumber Number Text 

進口

|Pname| City | Item 
Text Text Text 

所以基本上人事和採購表有1〜嘛ny關係,每個人可以從1到多次購買。 PID是Purchase表中的PK,同時也是Purchase表的FK。所以,如果我直接進行數據錄入,事情會很好。但數據每天早上都會發布,我必須導入它。它採用格式與我所示的格式相同的導入表格形式。

所以我的問題是如何將導入的數據表分佈到兩個表中,同時保持其1對多關係的完整性。

一種方法我把嘗試使用@@身份,這裏是我在使用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始終是導入的最後一個值。

所以我的問題是,我該如何去解決這個問題。它是我的代碼嗎?還是我過分複雜化一個簡單的問題?重申,我想要做的是從我的導入表中插入數據到兩個有外鍵關係的表中。

+0

您需要在創建PName之前檢查它是否存在。如果存在,請使用該密鑰。如果沒有,創建它並使用新密鑰。這引出了問題 - pName是否是唯一的?如果是這樣,爲什麼要打擾一個必須擡頭看的數字FK呢?如果沒有,這是不太可行的,因爲你不知道pID。 – Nikki9696

回答

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; 
相關問題