0

我刚刚学习了 MySQL 触发器及其工作原理。我决定将它应用到我的小型网站上。

我有一个用户表,其中创建了新用户帐户,我想保留在 UsersHistory 表中添加新帐户的历史记录。

错误是当我执行以下查询时,它给了我一个错误:

询问:

CREATE TRIGGER User_After_Insert 
AFTER INSERT ON UsersHistory FOR EACH ROW WHEN NOT NEW.Deleted 
BEGIN                  
    SET @changeType = 'DELETE';  

    INSERT INTO UsersHistory (UserID, changeType) 
    VALUES (NEW.ID, @changeType);    
END;

CREATE TRIGGER User_After_Insert1 
AFTER INSERT ON UsersHistory FOR EACH ROW WHEN NEW.Deleted 
BEGIN              
    SET @changeType = 'NEW';  

    INSERT INTO UsersHistory (UserID, changeType) 
    VALUES (NEW.ID, @changeType);        
END;

错误是:

1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以
在第 1 行的 'WHEN NOT NEW.Deleted BEGIN Â SET @changeType = 'DELE'附近使用正确的语法

我寻找解决方案,但我找不到。

谢谢

4

1 回答 1

1

您是否将 DELIMITER 设置为不同于“;”的内容?另外,我看到了一些我不知道在 mysql 中支持的东西(BEGIN 块之前的 WHEN 语句),所以这是我的建议:

delimiter //
CREATE TRIGGER User_After_Insert AFTER INSERT ON UsersHistory FOR EACH ROW
INSERT INTO UsersHistory (UserID, changeType) VALUES (NEW.ID, 'NEW')//
CREATE TRIGGER User_After_Delete AFTER DELETE ON UsersHistory FOR EACH ROW              
INSERT INTO UsersHistory (UserID, changeType) VALUES (OLD.ID, 'DELETE')//
delimiter ;

更新

由于您在下面的评论,我认为您需要阅读更多关于触发器的内容。但这是要点。

以上语句,在实际数据库中创建触发器。实际上,您在数据库模式中“安装”触发器。如果您具有适当的帐户权限,则在任何 mysql 客户端中运行语句都会创建触发器。

现在,从这个阶段开始,您不再从 PHP 或类似的东西显式调用它们。它们存在于数据库中,并在您执行某些操作时自动调用。在上述情况下,从 UserHistory 中删除一条记录或将一条记录插入到 UserHistory 之后。

因此,当您从 php 脚本运行“INSERT INTO UserHistory VALUES ...”时,数据库将自动触发触发器。

希望这是有道理的。

于 2012-05-15T01:30:05.213 回答