Thắc mắc về trigger

Dữ liệu mẫu
fav

user_id book_id
1 2
3 2
4 2

Books

book_id fav
2 3

Em có tạo trigger mỗi lần insert hoặc delete vào table “fav” thì sẽ câp nhật lại column books.fav . Nhưng vấn đề là khi em muốn xóa row books.book_id = 2 . Thì em phải xóa trong fav trước vì ràng buộc dữ liệu, đồng nghĩa nếu có 1000 lượt thích em phải update 1000 lần trước khi xóa 1 row trong books .

Vậy cho em hỏi có cách nào để tạm thời ngưng trigger của “fav” khi em xóa trong books ko ? Em xin cảm ơn

1 Like

đơn giản, đừng thêm ràng buộc

2 Likes

Mình đang hiểu là bạn đặt trigger ở bảng “fav” vì vậy việc xóa ở bảng '“books” sẽ không ảnh hưởng đến trigger ở bảng “fav” cả.

Nếu mình hiểu sai thì xin bạn cho thêm thông tin để mình cùng tìm cách giải quyết tiếp nhé.

Ràng buộc dữ liệu ạ . Nếu xóa books.book_id thì fav.book_id vẫn còn . Nên phải xóa từ fav trước nếu ko nó ko cho xóa

1 Like

ON DELETE CASCADE vào fav.book_id thì sao bạn?

1 Like

Cách dễ nhất như bạn Cat Lord chia sẻ: “Bỏ ràng buộc giữa 2 bảng đi”.

Lý thuyết thì 2 thực thể nó ràng buộc như vậy. Nhưng trong thực tế, chúng ta nên bỏ ràng buộc đi.

Như vậy, việc code và test cũng trở nên dễ dàng hơn.

Nếu cần ràng buộc thì dùng code chứ không ràng buộc ở dataBase.

Còn 1 vấn đề trong ví dụ của bạn nữa làm mình thắc mắc: 2 bảng của bạn đang liên kết kiểu gì vậy? n - n hay 1 - n. Trong bảng fav thì có book_id, trong bảng Books lại có fav id.

1 Like

Dạ books.fav column tổng số lựợt người đã thích đối với mỗi book . Cho dù mất ràng buộc thì nó cũng UPDATE 1000 lần ạ .

Bạn dùng DataBase nào nhỉ?

Mình nghĩ là bỏ ràng buộc hoặc bỏ trigger đi thì nó sẽ không UPDATE 1000 lần nữa đâu.

Hoặc có 1 cách khác (outside of the box):

  • Bước 1: Trong bảng Books bạn thêm 1 cột kiểu boolean có tên là active. cột này mặc định là 0 (active).
  • Bước 2: Khi nào xóa 1 row trong Books, bạn sẽ không xóa vật lý nữa mà đơn giản chỉ thay đổi giá trị của cột active từ 0 sang 1 (inactive). Việc này được gọi là xóa logic
  • Bước 3: Ở ngoài danh sách books ở giao diện. Bạn sẽ chỉ hiển thị những book có giá trị cột active là 0. Còn giá trị bằng 1 thì không hiển thị.

=> Như vậy bạn sẽ không phải lo trigger UPDATE 1000 row kia.

  • Ưu điểm kèm theo: Dữ liệu Book bị xóa không mất đi trên thực tế. Điều này khiến việc ghi log hoặc truy vết dễ dàng hơn.
  • Nhược điểm: Theo thời gian. Số bản ghi trong bảng Books sẽ ngày càng lớn, khiến DataBase sẽ phình dữ liệu. Điều này yêu cầu nhân viên phát triển phải vào cơ sở dữ liệu để dọn dẹp (vì người dùng không xóa vật lý mà chỉ xóa logic)

Hy vọng câu trả lời chậm chễ của mình sẽ giúp ích được cho bạn trong công việc.

Thân ái

5 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?