このようなテーブルから始めた場合。。。
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;
単一のトランザクションを使用すると、3つの挿入すべてがデータベースに書き込まれるか、いずれも書き込まれないことが保証されます。代替案は
- データベースに更新可能なビューを作成し、3つのテーブルすべてを結合し、ビューに挿入するには、
- データベースにストアドプロシージャを記述し、ストアドプロシージャを挿入し、
- 各テーブルに個別に挿入します。これは、著者がわからなくても本の存在が重要であると想定し、その逆も同様です。(これはおそらく私が本や著者のために行うことです。)
既存の著者のために新しい本を追加する場合は、わずかに異なるトランザクションを実行します。
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番号を保存するために特別なことをしたりする必要はありません。生成します。コントロールのプロパティの1つからアクセスできます。(Accessのフォームとコントロールは、データを高度に認識しています。そのように機能します。)ただし、必要に応じて、AccessにMicrosoftのOLEDBプロバイダーを使用している場合はselect @@identity
、接続で使用される最後のID番号を取得するために使用できます。