2012-04-29 33 views
10

Bộ nhớ của tôi là INNODB, Tôi đang cố gắng tạo trình kích hoạt với 2 truy vấn trong câu lệnh IF. Xuống bạn sẽ nhìn thấy kích hoạt cung cấp cho tôi những lỗiTrình kích hoạt Mysql với IF THEN

delimiter | 
CREATE TRIGGER count_delete_videos BEFORE DELETE ON videos 
    FOR EACH ROW BEGIN 
    UPDATE counts SET count = count - 1 WHERE name = 'all'; 

    IF OLD.published = 1 THEN 
     DELETE FROM videos_categories WHERE id_video = OLD.id; 
     DELETE FROM videos_tags WHERE id_video = OLD.id; 
    END IF; 
    END; 
| 
delimiter ; 

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '= OLD.id; 
    END IF; 
    END' at line 6 

Đây là 2 gây nên mà tôi kích hoạt với cái đầu tiên.

delimiter | 
CREATE TRIGGER count_delete_videos_tags AFTER DELETE ON videos_tags 
    FOR EACH ROW BEGIN 
    UPDATE tags SET count = count - 1 WHERE id = OLD.id_tag; 
    END; 
| 
delimiter ; 


delimiter | 
CREATE TRIGGER count_delete_videos_categories AFTER DELETE ON videos_categories 
    FOR EACH ROW BEGIN 
    UPDATE categories SET count = count - 1 WHERE id = OLD.id_category; 

    IF OLD.id_category <> 20 AND OLD.id_category <> 34 THEN 
     UPDATE counts SET count=count-1 WHERE name='english'; 
    ELSEIF OLD.id_category = 34 THEN 
     UPDATE counts SET count=count-1 WHERE name='german'; 
    ELSEIF OLD.id_category = 20 THEN 
     UPDATE counts SET count=count-1 WHERE name='italian'; 
    END IF; 
    END; 
| 
delimiter ; 

Nhưng, lần này hoạt động hoàn hảo

delimiter | 
    CREATE TRIGGER count_delete_videos BEFORE DELETE ON videos 
     FOR EACH ROW BEGIN 
     UPDATE counts SET count = count - 1 WHERE name = 'all'; 

     IF OLD.published = 1 THEN 
      DELETE FROM videos_categories WHERE id_video = OLD.id; 
     END IF; 
     END; 
    | 
    delimiter ; 

Query OK, 0 rows affected (0.16 sec) 

Làm thế nào tôi có thể làm cho công việc kích hoạt đầu tiên? những gì tôi đang làm sai? Thx vì đã giúp tôi.

+0

bạn có thể đưa ra mệnh đề if hai lần cho mỗi câu lệnh xóa không? – nawfal

+0

(Ngoại trừ các quầy), bạn có biết rằng bạn có thể có cùng một hành vi với ràng buộc khóa ngoài (một từ mỗi bảng) đến bảng 'video', bằng cách xác định các FK với' ON DELETE CASCADE'? –

+0

vâng tôi biết, nhưng trên các phím khởi động kích hoạt trong mysql không kích hoạt, vì vậy tôi phải xóa nó bằng trình kích hoạt khác để truy vấn này kích hoạt các trình kích hoạt khác –

Trả lời

12

Theo như tôi có thể nói cả hai tác nhân là OK, nhưng bạn có thể thử như sau:

DELIMITER $$ 
CREATE TRIGGER count_delete_videos BEFORE DELETE ON videos 
FOR EACH ROW 
BEGIN 
    UPDATE counts SET count = count - 1 WHERE name = 'all'; 

    IF OLD.published = 1 THEN BEGIN 
    DELETE FROM videos_categories WHERE id_video = OLD.id; 
    DELETE FROM videos_tags WHERE id_video = OLD.id; 
    END; END IF; 
END$$ 

DELIMITER ; 
+0

Đây là những gì tôi nhận được -> ERROR 1235 (42000): Phiên bản MySQL này không ' chưa hỗ trợ 'nhiều trình kích hoạt có cùng thời gian và sự kiện hành động cho một bảng' –

+0

@ P.Alex - Và phiên bản MySQL của bạn là gì? –

+1

@ P.Alex, rõ ràng bạn sẽ phải xóa trình kích hoạt khác trước khi thêm trình kích hoạt này. – Johan

-1

DELIMITER $$ CREATE TRIGGER upd_check TRƯỚC KHI CẬP NHẬT tài khoản FOR EACH ROW BEGIN

 IF NEW.amount > 100 THEN 
      SET NEW.amount = 100 
    END END IF 
    END$$ 
    DELIMITER ; 

trong mã này hiển thị lỗi như # 1064 - Bạn có lỗi trong cú pháp SQL của mình; kiểm tra hướng dẫn tương ứng với phiên bản máy chủ MariaDB của bạn để có cú pháp đúng để sử dụng gần 'END END IF END' tại dòng 7

Các vấn đề liên quan