2010-11-04 31 views
18

Bunun mümkün olup olmadığını bilmiyorum, ancak tablodaki active adlı bir sütüm var. Etkin sütun ne zaman değiştirilirse, date sütununda, ancak active sütunu değiştirilirse SADECE tarihini sıfırlamak istiyorum.MySQL Tetikleyici sorusu: Sadece bir sütun değiştirildiğinde ne zaman tetiklenir?

Diğer sütunlar değiştirilir, ancak active sütununda değilse, tarih aynı kalır.

DELIMITER // 
CREATE TRIGGER updtrigger BEFORE UPDATE ON mytable 
    FOR EACH ROW 
    BEGIN 
    IF NEW.active <> OLD.active THEN 
    SET NEW.date = '';  
    END IF; 
    END 
    // 
+0

güncelleme, aktif sütunun yeni değerine eski değerini kontrol http://www.java2s.com/Code/Oracle/Trigger/ReferenceoldandnewvaluebycolumninabeforeupdateTrigger.htm –

+0

http örneğe görmek gerek önce: // stackoverflow .com/questions/6296313/mysql-trigger-update-only-if-row-has-değiştirilen – zloctb

cevap

27

şey 2. örnekte IF testi ile bir sorun haline Ran. Değerlerden biri sıfır olduğunda, <> testi null değerini döndürür. Bu, testin karşılanmamasına yol açar ve tetikleyicinin eylemi, bir değer null değerine eşit olmasa bile çalıştırılmayacaktır. Bunu düzeltmek için < => (NULL-safe equal) kullanan bu sınama ile geldim. Umarım bu birisine yardım eder.

DELIMITER $$ 
DROP TRIGGER IF EXISTS updtrigger ; 
$$ 
CREATE TRIGGER updtrigger AFTER UPDATE 
    ON yourTable FOR EACH ROW 
BEGIN 
    IF ((NEW.active <=> OLD.active) = 0) THEN 
    SET NEW.date = '';  
    END IF; 
$$ 
+0

Tarihin güncel tarihe güncellenmesini istiyorsanız, satırın 'SET NEW.date = CURDATE(); ' – kylex

+3

eğer tarih istiyorsanız evet, tarih + saati kullanın ŞİMDİ kullanın() –

+1

Eğer ** etkin olsaydınız = 1 ** DB'de aktif 1 iken bu bir değişiklik olmaz mıydı? Teknik olarak tahmin ediyorum, çünkü sütunu ve veritabanı terminolojisini ayarladınız, bu bir sütun değişimi. Ama ** NEW.active değil OLD.active ** size sadece NEW ve OLD farklı değerler verdiyse verir! Bu durumda ne yapacaksın? @HaimEvgi – edam

13

gibi

+1

Aşağıdaki yanıtta olduğu gibi, sıfır ile karşılaştırmak yerine 'NOT' işlecini kullanabilirsiniz: http://stackoverflow.com/a/24041832/1419007. Aksi halde, iyi cevap. – user2428118

İlgili konular