2010-06-29 60 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