如果你開始使用這些表格。 。 。
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號。
插入書籍。插入作者。插入連接表。使用事務將使進程*原子*(但不*同時*)。祝你好運德爾福/訪問 - 我使用ORMs或生成DAL做骯髒的工作:) – 2012-06-17 19:21:37