如果您从这些表格开始。. .
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 或做任何特殊的事情来保存任何自动 ID 号到 dbms生成;它将可以通过控件的属性之一访问。(Access 的表单和控件具有高度的数据感知能力;这就是它们的工作方式。)但是,如果您必须这样做,并且您正在使用 Microsoft 的 OLEDB 提供程序来访问 Access,您可以使用它select @@identity
来获取通过您的连接使用的最后一个 ID 号。