PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

postgres. batas kedalaman tumpukan plpgsql terlampaui

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara mengurangi baris hasil kueri SQL secara merata dalam rentang penuh?

  2. TAHUN memberikan kesalahan

  3. bagaimana postgres menangani tipe data bit?

  4. Memeriksa apakah tabel postgresql ada di bawah python (dan mungkin Psycopg2)

  5. Mengapa PostgreSQL tidak menyukai nama tabel UPPERCASE?