Oke, jika Anda benar-benar ingin pemicu pada pembaruan, apa yang dapat Anda lakukan adalah mengatur pemicu ini sebagai kolom khusus, sehingga tidak dipicu pada pembaruan ke all_books
, yang menyebabkan rekursi Anda. Sesuatu seperti ini -
create trigger total2
after update of copy_id
on totalbooks
for each row
execute procedure total1();
Tentu saja, Anda dapat mengubah kolom mana yang memicu fungsi, saya hanya memilih copy_id
karena itulah yang Anda hitung.
NAMUN
Jika Anda memperbarui dengan count()
hasilnya, Anda cukup meletakkan pemicu di INSERT
dan DELETE
tindakan. Dengan cara ini pemicu akan diaktifkan saat hitungan berubah, tetapi tidak akan dipicu oleh pembaruan itu sendiri. // EDIT:Sejak sum
your Anda hanya hitungan semua record dalam copies
, itu hanya akan berubah ketika catatan dimasukkan atau diperbarui, jadi menjalankan pemicu ini pada pembaruan tidak akan masuk akal.
EDIT:Saya pikir akan berguna untuk menambahkan tautan ke BUAT Dokumentasi PEMICU . Lihat bagian berlabel "acara", karena ini menjelaskan cara menentukan kolom dalam acara.
EDIT UNTUK INFORMASI BARU:
Mengingat apa yang tampaknya perlu Anda capai, saya pikir Anda perlu memikirkan kembali desain data Anda, saya sarankan Anda menggunakan hubungan induk-anak (Setiap kali Anda menyimpan data bersama di banyak baris dalam tabel karena mereka memiliki kesamaan, itu adalah tanda bahwa Anda mungkin memerlukan tabel induk sebagai gantinya).
Miliki books
tabel di mana setiap baris adalah informasi tentang satu buku (judul, penulis, dll), dan kemudian memiliki copies
tabel di mana setiap baris menyimpan informasi tentang satu salinan buku (nomor seri, terakhir check out, dll).
Dengan begitu, mendapatkan jumlah salinan semudah SELECT COUNT(*) FROM copies WHERE book_id=[some book id]
.
Jika Anda benar-benar ingin menyimpan penghitungan di suatu tempat, lakukan di books
meja.
Buat INSERT OR UPDATE
pemicu pada copies
yang melakukan UPDATE books SET copy_count=(SELECT COUNT(*) FROM copies WHERE book_id=NEW.book_id) WHERE id=NEW.book_id
.
Kemudian buat DELETE
pemicu pada salinan yang UPDATE books SET copy_count=(SELECT COUNT(*) FROM copies WHERE book_id=OLD.book_id) WHERE id=OLD.book_id
Alasan untuk dua pemicu adalah bahwa NEW
variabel hanya tersedia di INSERT
atau UPDATE
pemicu, dan OLD
hanya tersedia di DELETE
pemicu. Anda bisa melakukan semuanya sebagai satu pemicu, tetapi itu membutuhkan lebih banyak kode daripada yang ingin saya masukkan di sini.
Pastikan semua pemicu Anda adalah AFTER
pemicu, atau baris yang baru dimasukkan/dihapus tidak akan dipertimbangkan dalam hitungan.