2017-09-24 293 views
0

是否可以在mysql觸發器中插入條件類型的更新?如果我需要在某種類型的更新之後執行某些操作,例如,如果更新是字段值中某種類型的更改。更好地說,如果我需要在另一個表中增加一個值,然後我的原始表中的特定字段將其值更改爲特定值,是否有可能? 任何幫助將不勝感激。
我想這一點:帶觸發條件的MySQL觸發器

CREATE TRIGGER Increment 
AFTER UPDATE ON Subscription 
FOR EACH ROW 
BEGIN 
UPDATE USER 
SET num_sub=num_sub+1 
IF NEW.State <> OLD.State AND NEW.STATE='C' 
END IF 
END 

但它不工作,語法錯誤。我通過phpmyadmin插入觸發器。

+0

yes是可能的,所以換句話說,當您在某些表操作上運行觸發器時,如果表沒有在第一個表上執行一些DML,則始終可以在不同的表上執行insert/update/delete操作。 提供您正在嘗試做的一些示例示例。 –

+2

'如果NEW.column1 <> OLD.column1 AND NEW.column1 ='具體值'UPDATE table2 ...'。如果你想得到一個好的答案,你應該發佈兩個表的CREATE語句,並在你的問題中更具體。 –

+0

可能重複的[MySQL觸發器在插入/更新事件](https://stackoverflow.com/questions/15975877/mysql-trigger-on-insert-update-events) – cwallenpoole

回答

1

嘗試是這樣的:

CREATE TRIGGER Increment 
AFTER UPDATE ON Subscription 
FOR EACH ROW 
BEGIN 
    IF NEW.State <> OLD.State AND NEW.STATE='C' THEN 
     UPDATE USER 
     SET num_sub=num_sub+1 
     WHERE USER.id = NEW.user_id; -- change this condition as you need 
    END IF; 
END 

這也應該工作:

CREATE TRIGGER Increment 
AFTER UPDATE ON Subscription 
FOR EACH ROW 
    UPDATE USER 
    SET num_sub=num_sub+1 
    WHERE USER.id = NEW.user_id 
     AND NEW.State <> OLD.State 
     AND NEW.STATE='C'; 

注:NEWOLD指該行從Subscription表正在被更新。 OLD包含更新前的值。 NEW包含更新後的值。因此,要檢查state是否已更改,您可以比較NEW.State <> OLD.State

+0

USER.id必須是USER表或SUBSCRIPTION表的USER.id? (顯然在subscription.userS上有一個指向user.id的FK)。謝謝!! – JamieITGirl

+1

這只是一個問題,因爲你沒有提供模式和關係。現在將該行更改爲'WHERE USER.ID = NEW.userS'。順便說一句:'USER.id'表示'USER'表中的列id。 'NEW.userS'是剛剛在'Subscription'表中更新的行中的'userS'列。 –

+0

我剛剛嘗試過,但它在USER表上沒有任何作用。也許這是因爲Subscription.UserS指向User.id,但它不是訂閱表的主鍵?如果是這樣,我該如何解決? – JamieITGirl