PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

bưu điện. Đã vượt quá giới hạn độ sâu ngăn xếp plpgsql

Đượ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 INSERTDELETE 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ế).

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách truy vấn siêu dữ liệu của các chỉ mục trong PostgreSQL

  2. Hàm postgres ratio_to_report

  3. Rails Postgresql nhiều lược đồ và cùng một tên bảng

  4. Cách Tầng () hoạt động trong PostgreSQL

  5. (Các) lệnh nào `heroku pgbackups:capture` chạy trên máy chủ để thực hiện sao lưu?