2012-04-29 35 views
10

Depolama alanım INNODB, IF deyiminde 2 sorgu içeren bir tetikleyici oluşturmaya çalışıyorum. Aşağı Eğer bu 2 i ilkinden aktive olduğunu tetikler olan bana hataMysql Tetikleyici ile 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 

verir tetiği görebilirsiniz.

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 ; 

Ama bu

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) 

Nasıl ilk tetik çalışması yapabilir mükemmel çalışıyor? neyi yanlış yapıyorum? Bana yardım için Thx.

+0

öğelerini her iki silme deyimine iki kez verebilir misiniz? – nawfal

+0

(Sayaçlar hariç), FKs'yi "ON DELETE CASCADE" ile tanımlayarak Yabancı Davranış kısıtlamasıyla (her tablodan bir tane) "video" tablosuna aynı davranışı sağlayabileceğinizi biliyor musunuz? –

+0

evet biliyorum, ama mysql içinde yabancı tuşlar tetikleyicileri etkinleştirmeyin, bu yüzden başka bir tetikleyici ile silmek gerekir bu sorgular diğer tetikleyicileri etkinleştirir –

cevap

12

Bildiğim kadarıyla her iki tetikleyiciler Tamam söyleyebilir, ancak deneyebilirsiniz olarak aşağıdaki:

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

Bu ne olsun -> ERROR 1235 (42000): Bu sürüm MySQL yok ' t 'henüz aynı eylem süresi ve bir tablo için olay ile birden fazla tetikleyici' desteği ' –

+0

@ P.Alex - Ve MySQL sürümünüz nedir? –

+1

@ P.Alex, açıkçası bunu eklemeden önce diğer tetikleyiciyi silmeniz gerekecek. – Johan

-1

DELIMITER $$ HER ROW İÇİN hesaba ÜZERİNE UPDATE ÖNCE TRIGGER upd_check CREATE BEGIN

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

Bu kodda # 1064 gibi hatalar gösterilmektedir - SQL sözdiziminde bir hata var; Doğru sözdizimi için MariaDB sunucu sürümünüze karşılık gelen elkitabına bakarak, 'END END IF END' satırında kullanmak için satır 7