Nếu bạn bắt đầu với các bảng như thế này. . .
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)
);
. . . và nếu bạn cần chèn một cuốn sách mới và một tác giả mới cùng một lúc, bạn có thể thực thi một giao dịch SQL như thế này.
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;
Sử dụng một giao dịch duy nhất đảm bảo rằng cả ba lần chèn đều được ghi vào cơ sở dữ liệu hoặc không có mã nào được chèn. Lựa chọn thay thế là
- để xây dựng một cái nhìn có thể cập nhật trong cơ sở dữ liệu, tham gia cả ba bảng, và chèn vào xem,
- để viết một thủ tục lưu trữ trong cơ sở dữ liệu, và chèn qua thủ tục lưu trữ, và
- để chèn vào mỗi bảng riêng biệt, giả định rằng sự tồn tại của cuốn sách là quan trọng ngay cả khi bạn không biết tác giả và ngược lại. (Đây có lẽ là những gì tôi muốn làm cho sách và tác giả.)
Nếu bạn đang thêm một cuốn sách mới cho tác giả hiện tại, bạn thực hiện giao dịch hơi khác.
begin transaction;
insert into books values (2, 'Second book');
insert into book_authors (book_id, author_id) values (2, 1);
commit;
Tôi tưởng tượng Delphi giống như bất kỳ ngôn ngữ phía máy khách nào khác ở đây. Thay vì các số nguyên theo nghĩa đen, bạn nên tham khảo một số thuộc tính của các điều khiển nhận biết dữ liệu, có lẽ là thuộc tính "giá trị" hoặc "văn bản". Và bạn thực hiện giao dịch trong sự kiện "nhấp" của nút. Nếu có Delphi đủ "nhận biết dữ liệu" - sử dụng các điều khiển được gắn với cột và hàng trong cơ sở dữ liệu, như điều khiển gốc của Access - bạn có thể không cần thực thi bất kỳ SQL nào hoặc làm bất cứ điều gì đặc biệt để lưu bất kỳ tự động nào Số ID mà các dbms tạo ra; nó sẽ có thể truy cập thông qua một trong các thuộc tính của điều khiển. Nhưng nếu bạn phải, và bạn đang sử dụng nhà cung cấp OLEDB của Microsoft cho Access, bạn có thể sử dụng select @@identity
để lấy số id cuối cùng được sử dụng thông qua kết nối của bạn.
Nguồn
2012-06-17 19:42:53
Chèn vào sách. Chèn vào Tác giả. Chèn vào bảng tham gia. Sử dụng Giao dịch sẽ thực hiện quy trình * nguyên tử * (nhưng không * đồng thời *). Chúc may mắn với Delphi/Access - Tôi sử dụng ORM hoặc tạo-DAL để làm công việc bẩn :) –