2017-09-24 249 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