Jeśli zaczynałeś od tabel takich jak te. . .
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)
);
. . . i jeśli chcesz wstawić nową książkę i nowego autora w tym samym czasie, możesz wykonać transakcję SQL w ten sposób.
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;
Korzystanie z pojedynczej transakcji gwarantuje, że wszystkie trzy wkładki zostaną zapisane w bazie danych lub że żaden z nich nie zostanie zapisany. Alternatywy są
- zbudować dającym się aktualizować widok w bazie danych, łączącą wszystkie trzy tabele i wstawienie do widzenia
- napisać procedurę przechowywaną w bazie danych, a następnie włóż poprzez procedury przechowywanej, a
- wstawić do każdej tabeli osobno, co zakłada, że istnienie książki jest ważne, nawet jeśli nie znasz autora i na odwrót. (Prawdopodobnie to bym zrobił dla książek i autorów.)
Jeśli dodawałeś nową książkę dla istniejącego autora, wykonałeś nieco inną transakcję.
begin transaction;
insert into books values (2, 'Second book');
insert into book_authors (book_id, author_id) values (2, 1);
commit;
Wyobrażam sobie, że Delphi jest jak każdy inny język po stronie klienta. Zamiast literalnych liczb całkowitych odwołujesz się do niektórych właściwości kontrolek obsługujących dane, być może do właściwości "wartości" lub "tekstu". I możesz wykonać transakcję w zdarzeniu "kliknij" przycisku.
Jeśli Delphi jest wystarczająco "świadomy danych" - za pomocą elementów sterujących, które są powiązane z kolumnami i wierszami w bazie danych, takimi jak natywne elementy kontrolne programu Access - nie trzeba wykonywać żadnych instrukcji SQL ani wykonywać żadnych czynności specjalnych w celu zapisania automatycznego Numer identyfikacyjny, który generuje dbms; będzie dostępny za pośrednictwem jednej z właściwości kontrolki. (Formularze i kontrolki programu Access są w wysokim stopniu świadome danych - tak działa ,). Ale jeśli musisz i korzystasz z dostawcy OLEDB Microsoftu dla Access, możesz użyć numeru select @@identity
, aby uzyskać ostatni numer identyfikacyjny używany przez twoje połączenie.
Wstawianie do książek. Wstaw do autorów. Wstaw do tabeli łączenia. Korzystanie z Transakcji spowoduje, że proces * będzie atomowy * (ale nie * jednoczesny *). Powodzenia w Delphi/Access - Używam ORM-ów lub generowanych-DAL-ów do brudnej pracy :) –