Được rồi, nếu bạn thực sự muốn trình kích hoạt khi cập nhật, bạn có thể làm gì để đặt trình kích hoạt này là cột cụ thể để nó không được kích hoạt khi cập nhật cho all_books
, điều này đang gây ra đệ quy của bạn. Một cái gì đó như thế này -
create trigger total2
after update of copy_id
on totalbooks
for each row
execute procedure total1();
Tất nhiên, bạn có thể thay đổi cột nào kích hoạt chức năng, tôi chỉ chọn copy_id
bởi vì đó là những gì bạn đang đếm.
TUY NHIÊN
Nếu bạn đang cập nhật bằng count()
kết quả là bạn có thể chỉ cần đặt trình kích hoạt trên INSERT
và DELETE
các hành động. Bằng cách này, trình kích hoạt sẽ kích hoạt khi số lượng thay đổi, nhưng bản thân nó sẽ không được kích hoạt bởi bản cập nhật. // CHỈNH SỬA:Vì sum
của bạn chỉ là tổng số tất cả các bản ghi trong copies
, nó sẽ chỉ thay đổi khi bản ghi được chèn hoặc cập nhật, do đó, việc chạy trình kích hoạt này khi cập nhật sẽ không có ý nghĩa gì.
CHỈNH SỬA:Tôi nhận ra rằng sẽ rất hữu ích nếu thêm liên kết vào TẠO Tài liệu TRIGGER . Xem phần có nhãn "sự kiện", vì phần này trình bày chi tiết cách chỉ định các cột trong sự kiện.
CHỈNH SỬA THÔNG TIN MỚI:
Với những gì có vẻ như bạn cần phải hoàn thành, tôi nghĩ bạn cần phải suy nghĩ lại về thiết kế dữ liệu của mình, tôi khuyên bạn nên sử dụng mối quan hệ cha-con (Bất cứ khi nào bạn lưu vào bộ nhớ đệm dữ liệu được chia sẻ trên nhiều hàng trong bảng vì chúng có điểm chung, điều đó là một dấu hiệu cho thấy bạn có thể cần một bảng cha để thay thế).
Có books
bảng trong đó mỗi hàng là thông tin về một cuốn sách (tên sách, tác giả, v.v.), sau đó có copies
bảng trong đó mỗi hàng chứa thông tin về một bản sao của sách (số sê-ri, lần kiểm tra cuối cùng, v.v.).
Bằng cách đó, việc đếm số bản sao đơn giản như SELECT COUNT(*) FROM copies WHERE book_id=[some book id]
.
Nếu bạn thực sự muốn lưu số đếm vào bộ nhớ cache ở đâu đó, hãy làm điều đó trên books
bàn.
Tạo INSERT OR UPDATE
kích hoạt trên copies
điều đó thực hiện UPDATE books SET copy_count=(SELECT COUNT(*) FROM copies WHERE book_id=NEW.book_id) WHERE id=NEW.book_id
.
Sau đó, tạo một DELETE
kích hoạt trên các bản sao UPDATE books SET copy_count=(SELECT COUNT(*) FROM copies WHERE book_id=OLD.book_id) WHERE id=OLD.book_id
Lý do cho hai trình kích hoạt là NEW
biến chỉ có sẵn trong INSERT
hoặc UPDATE
trình kích hoạt và OLD
chỉ có sẵn trong DELETE
gây nên. Bạn có thể làm tất cả như một lần kích hoạt, nhưng điều đó đòi hỏi nhiều mã hơn tôi muốn đặt ở đây.
Đảm bảo rằng tất cả các trình kích hoạt của bạn là AFTER
trình kích hoạt hoặc nếu không một hàng mới được chèn / xóa sẽ không được tính đến.