如何将记录同时插入到两个数据库表中?

Posted

技术标签:

【中文标题】如何将记录同时插入到两个数据库表中?【英文标题】:How does one insert records simultaneously into two database tables? 【发布时间】:2012-06-17 19:09:30 【问题描述】:

我是 Delphi 中数据库和 db 的新手,通过在线教学材料了解这两者。我正在努力解决现实生活与我找到的例子之间的差异。具体来说,考虑常见的 Books 和 Authors 多对多关系。假设您有一个 Book 表(book_id、book_title 等)、一个 Author 表(author_id、author_name 等)和一个 AuthorBook 连接表。这三个表都有唯一的 ID,自动生成,作为主键。

示例始终以已插入各自表中的作者和书籍信息开头。不过,在现实生活中,我认为您会尝试同时将记录插入两个表中,,用户会看到一个表单或网格,其中包含输入书名及其作者的位置(s )。假设数据感知控件、底层 Access 数据库(或其他可通过 SQL 更改的东西),如何在 Delphi 中编写类似的代码?

【问题讨论】:

插入书籍。插入作者。插入连接表。使用事务将使过程原子(但不是同时)。祝 Delphi/Access 好运——我使用 ORM 或生成的 DAL 来完成这项繁琐的工作 :) 【参考方案1】:

如果您从这样的表格开始。 . .

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 号。

【讨论】:

只要知道主键值,你的答案就很好。 OP 声明“所有三个表都将具有唯一的 ID,自动生成,作为主键。”您未能解决他将如何获取书籍和作者的主键值以用于 book_authors 的新书籍或 autohrs。 @Catcall:周到而有帮助的答案。感谢您抽出宝贵时间回答我的问题。【参考方案2】:

如果使用 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 函数(或数据库中的等效函数)

【讨论】:

以上是关于如何将记录同时插入到两个数据库表中?的主要内容,如果未能解决你的问题,请参考以下文章

SQL语句怎么同时往两个表中插入不同的记录

插入数据库表中一条记录同时也插入另一个表中的SQL语句怎么写

怎么把数据同时插入到数据库的两个表中

如何使用触发器从两个不同的表中插入数据

如何将记录插入到 sql server express 数据库表中?

如何在 SQL 服务器中将数据插入到两个不同的表中,同时在 SQL 中具有 ORDER# 主键