Se hai iniziato con tabelle come queste. . .
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)
);
. . . e se è necessario inserire un nuovo libro e un nuovo autore contemporaneamente, è possibile eseguire una transazione SQL come questa.
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;
Utilizzando una singola transazione garantisce che o tutti e tre gli inserti vengono scritti nel database o che nessuno di loro lo sono. Alternative sono
- per costruire una visualizzazione aggiornabile nel database, unire tutti tre tabelle, ed inserendo nella vista,
- a scrivere una stored procedure nel database, e inserire attraverso la procedura memorizzata, e
- da inserire in ogni tabella separatamente, il che presuppone che l'esistenza del libro sia importante anche se non si conosce l'autore e viceversa. (Questo è probabilmente quello che farei per libri e autori.)
Se stavi aggiungendo un nuovo libro per un autore esistente, eseguiresti una transazione leggermente diversa.
begin transaction;
insert into books values (2, 'Second book');
insert into book_authors (book_id, author_id) values (2, 1);
commit;
Immagino che Delphi sia come qualsiasi altro linguaggio lato client qui. Invece di interi letterali, dovresti fare riferimento ad alcune proprietà dei controlli basati sui dati, forse una proprietà "valore" o "testo". E avresti eseguito la transazione nell'evento "click" di un pulsante.
Se Delphi è sufficientemente "in grado di riconoscere i dati" - utilizzando i controlli associati a colonne e righe in un database, come i controlli nativi di Access - potrebbe non essere necessario eseguire qualsiasi SQL o fare qualcosa di speciale per salvare automaticamente Numero ID generato dal dbms; sarà accessibile attraverso una delle proprietà del controllo. (Le forme e i controlli di accesso sono altamente consapevoli dei dati: è così che funzionano ). Ma se è necessario e si utilizza il provider OLEDB di Microsoft per Access, è possibile utilizzare select @@identity
per ottenere l'ultimo numero ID utilizzato tramite la connessione.
Inserisci nei libri. Inserisci negli autori. Inserisci nella tabella di join. L'uso delle transazioni renderà il processo * atomico * (ma non * simultaneo *). Buona fortuna con Delphi/Access - Io uso ORM o DAL generati per fare il lavoro sporco :) –