2010-06-29 83 views
1

在數據庫中,那裏是一個多對多的關係(比如3臺這樣的舉例)SQL插入在AJAX形式

Book | Author | BookAuthor 
_____ | ______ | __________ 
BookId | AuthorId | BookId 
Title | Name  | AuthorId 
...  | ...  | 

我想要一個窗體來創建一個新的書。在這種形式下,用戶將輸入關於該書的信息(標題等),並且他們將通過相同的表格選擇該書的作者。

在這樣的情況下,你什麼時候在Book表中插入?你這樣做的時候:

  1. 您訪問的形式,讓您獲得BOOKID,並且可以在BOOKAUTHOR表作爲用戶添加的作者插入?

  2. 只有當用戶離開表單(您插入書本,然後插入BookAuthor)時才能做到這一點?

對於1,最終可能會產生一堆不需要的記錄,因爲即使用戶離開頁面或點擊取消時也會創建記錄。

對於2,您沒有BookId,因此您無法開始在BookAuthor表中插入,直到整個表單被填充(然後您無法真正使用AJAX)。

這似乎是一個相當普遍的情況,所以我想這樣做有一個正確的方法?

編輯:作者可以添加像標籤被添加到堆棧溢出(自動完成框)的問題,就像它在答案中建議的一樣。您添加一個標籤,但不能立即插入,因爲該問題在數據庫中尚不存在。所以當你提交你的問題時,我猜測自動完成框的內容被解析,並且同時插入(標籤和問題)。我不知道它是如何完成的(解析或其他),但這基本上是我試圖找出。

回答

0

您的AJAX調用將會打到插入Book表然後插入到您的BookAuthor表中的頁面。這兩個查詢都將在一個事務中完成,以維護主鍵/外鍵關係的完整性。

根據您的數據庫,可以通過許多不同的方式獲取Book表中的BookID。您可以在Book表插入後查詢它。

選擇最多(的BookID)作爲TheBookID從書

或者,如果你使用的是Oracle,你可能首先遞增的順序,插入書籍表之前。

選擇雙

BookID_SEQ.nextval然後你可以使用在書籍表這個序列號插入還有BOOKAUTHOR插入。

所有這些查詢都必須在事務中調用,儘管如此,一些偷偷摸摸的竊聽者不會潛入您的後面並竊取您的Max(BookID)或增加您的序列。

1

我絕對不會建議#1,因爲你說的原因,只是沒有邏輯意義。

我建議#2或者#2的進化。

首先,我想知道爲什麼你需要/需要使用AJAX來做到這一點 - 與最終聲明相反,這當然是可能的 - 但是你簡化的例子可以用同樣簡單的HTML表單提交。

無論如何,這取決於如何創建作者。您是否希望允許用戶同時創建作者條目,或者除此之外? (我假設後者)。

如果我正在做這個項目,我可能想讓用戶創建書籍條目並從自動完成的作者框中進行選擇。我還想讓他們從該框中創建任何新的作者條目。例如,如果他們輸入的作者名稱不在作者表中,系統會創建一個新條目。

在作者條目尚不存在的情況下,您需要創建一個新條目,這會爲您提供新的作者ID。

獲得作者ID後(可通過查找現有的或創建新的作者ID),可以創建書籍條目。完成後,您將擁有書籍ID,您可以在此處添加BookAuthor中的引用。

您可能希望將此全部內容包含在事務中,然後在創建BookAuthor條目後進行提交。

您可能希望爲自己的ID使用自動增量列,並且在鏈接到BookAuthor表時,您可能希望爲ID列使用外鍵約束。

這一切,您可以使用AJAX進行任何客戶端到服務器的通信 - 這只是從瀏覽器與服務器進行通信的一種方式。

+0

感謝您的回答。當你說「完成之後,你將擁有書籍ID」。這就是我真正想問的。你有你的AuthorID(通過插入或查找),但表單尚未提交(因爲用戶沒有立即點擊OK)。那麼你對你的ID做什麼?您只需將您的作者留在那裏,當用戶單擊確定時,您將解析ID(或名稱)的自動完成作者框?我同意你所提出的一切,這只是我無法想象的時機。 – 2010-06-29 20:15:54