Tôi có 2 bảng: comments
và comments_likes
.Thực hiện truy vấn trong mysql mà không cần kích hoạt trình kích hoạt (Cách vô hiệu hóa trình kích hoạt)
comments
id
message
likes
gây:
SAU DELETE
DELETE FROM comments_likes WHERE comment_id = OLD.id;
comments_likes
id
comment_id
gây:
SAU INSERT
UPDATE comments SET likes = likes + 1 WHERE comments.id = NEW.comment_id;
SAU DELETE
UPDATE comments SET likes = likes - 1 WHERE comments.id = OLD.comment_id;
SAU CẬP NHẬT
**omited code, updates comments**
Vì vậy, câu hỏi là, tôi có thể vô hiệu hóa các trigger khi kích hoạt chúng từ một cò?
Những gì tôi muốn là làm điều gì đó thích này:
SAU DELETE
IF NOT called_from_another_trigger() THEN
UPDATE comments SET likes = likes - 1 WHERE comments.id = OLD.comment_id;
END IF;
[EDIT]
Một giải pháp không được tối ưu hóa sẽ được (rất chậm truy vấn ... tạo truy vấn cho mỗi đăng ký LIKE):
BEGIN
IF (SELECT id FROM comments WHERE comments.id = OLD.comment_id) THEN
UPDATE comments SET comments.cache_likes = comments.cache_likes - 1 WHERE comments.id = OLD.comment_id;
END IF;
END
CẬP NHẬT LOW PRIORITY
và IGNORE
không hoạt động.
[EDIT 2]
Tôi có ý tưởng khác, có thể thiết lập một biến toàn cầu trong kích hoạt đầu tiên và đọc nó từ cò khác?
Ex:
đầu tiên kích hoạt:
@disable_triggers = true;
// do the stuff that calls another triggers
@disable_triggers = false;
kích hoạt khác:
if @disable_triggers = false then
// do the stuff
end if;
Ineresting! Bạn có thực sự vô hiệu hóa trình kích hoạt bên trong trình kích hoạt không? – Mchl
@Mchl: Vâng, với phương pháp này bạn có thể :) @var là các hình cầu cho kết nối. Bạn phải sử dụng IS NULL vì các biến chưa được định nghĩa luôn là NULL. – Wiliam
điều này đã giúp tôi 4 năm sau! tôi đã chính xác tìm kiếm một cái gì đó như thế này. sau 1 giờ googling và tìm kiếm SO, cuối cùng tôi đã tìm thấy câu trả lời của bạn. thật dễ dàng, nhưng tôi không bao giờ tự mình tìm ra được. tôi chỉ không được sử dụng để có thể "chương trình" với mysql. –