2012-06-17 75 views
6

我是Delphi的數據庫和數據庫的新手,通過在線教學資料學習。我正在努力解決現實生活和我發現的例子之間的差異。具體而言,考慮常見的書籍和作者多對多關係。假設你有一個Book表(book_id,book_title等),Author表(author_id,author_name等)和一個AuthorBook連接表。所有三個表都將具有自動生成的唯一ID作爲主鍵。如何將記錄同時插入到兩個數據庫表中?

這些示例始終以「作者」和「書本」信息已插入其各自表中。不過,在現實生活中,我想你會試圖同時在兩個表中插入記錄,,即,用戶會看到一個表格或網格,可以輸入書名和作者的位置。在Delphi中如何編寫這樣的代碼,假設數據感知控件,底層Access數據庫(或其他可通過SQL修改的)?

+4

插入書籍。插入作者。插入連接表。使用事務將使進程*原子*(但不*同時*)。祝你好運德爾福/訪問 - 我使用ORMs或生成DAL做骯髒的工作:) – 2012-06-17 19:21:37

回答

7

如果你開始使用這些表格。 。 。

create table books (
    book_id integer primary key, 
    book_title varchar(15) not null 
); 

create table authors (
    author_id integer primary key, 
    author_name varchar(15) not null 
); 

create table book_authors (
    book_id integer not null references books (book_id), 
    author_id integer not null references authors (author_id), 
    primary key (book_id, author_id) 
); 

。 。 。如果您需要同時插入新書和新作者,則可以像這樣執行SQL事務。

begin transaction; 
insert into books values (1, 'First book'); 
insert into authors values (1, 'First author'); 
insert into book_authors (book_id, author_id) values (1, 1); 
commit; 

使用單個事務可確保將所有三個插入寫入數據庫,或者它們都不是。替代方案是

  • 建立在數據庫中的更新的視圖,在加入所有三個表,並插入到視圖,
  • 寫在數據庫中存儲的過程,並通過存儲過程插入,和
  • 分別插入到每個表中,即使您不知道作者,該假定書的存在也很重要,反之亦然。 (這可能是我爲圖書和作者所做的。)

如果您要爲現有作者添加新書,您將執行稍微不同的事務。

begin transaction; 
insert into books values (2, 'Second book'); 
insert into book_authors (book_id, author_id) values (2, 1); 
commit; 

我想Delphi和其他客戶端語言一樣。您應該引用數據感知控件的某些屬性,而不是文字整數,可能是「值」或「文本」屬性。你會在按鈕的「點擊」事件中執行交易。

如果Delphi足夠「數據感知」 - 使用綁定到數據庫中的列和行的控件,比如Access的本地控件 - 您可能不需要執行任何SQL或做任何特殊的事情來保存任何自動dbms生成的ID號;它將通過控件的其中一個屬性進行訪問。 (Access的表單和控件具有高度的數據意識;這就是的工作方式。)但是,如果您必須使用Microsoft的OLEDB提供程序進行Access,則可以使用select @@identity獲取通過連接使用的最後一個id號。

+0

只要主鍵值知道你的答案是好的。 OP聲明:「所有三個表都有唯一的ID,自動生成爲主鍵。」您未能解決他將如何獲得書籍和作者的主要關鍵值,以便在book_authors中使用新書或autohrs。 – crefird

+0

@crefird:編輯答案。 –

+0

@Catcall:周到,樂於助人的答案。感謝您花時間回覆我的問題。 –

1

如果使用SQL,做這樣的事情(僞)

startTransaction; 
INSERT INTO Book VALUES('Book1'); 
bookID:=SELECT LastAutoInc FROM #Dummy; 
INSERT INTO Author VALUES('Author1'); 
authorID:=SELECT LastAutoInc FROM #Dummy; 
INSERT INTO BookAuthor VALUES(bookID, autherID); 
commit; 

的關鍵是事務內使用LastAutoInc功能(或數據庫中的等價物)的。

相關問題