我刚学会了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服务器版本对应的手册,以便在“WHEN NOT NEW.Deleted”附近使用正确的语法 开始Â
在第1行设置@changeType ='DELE'
我找了一个解决方案,但我找不到。
由于
答案 0 :(得分: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 ...”时,数据库将自动触发触发器。
希望有所作为。