我试图为一个家庭作业创建几个触发器,这个作业看起来很简单,但是我遇到了一个又一个问题。我自己和我的同学们被要求在PHPMyAdmin中创建一个在线食品订购数据库。作为一门入门课程,这是非常基本的东西,几年前我在以前的一个机构上过SQL课程,所以我现在回想起来了。
尽管我以前有过经验,我以前从来没有处理过触发器,也没有使用过PHPMyAdmin,但是我正在习惯它。我的数据库有8个表,但是在这种情况下,只有两个表是tbl_employee和tbl_employee_audit。我们的任务要求我们使用自动递增的“ID”(主键)和**varchar创建tbl_employee_audit(100)*为脚注。我们应该创建两个触发器:一个指示employee表中的最新添加,另一个指示何时从表中删除了某个雇员。我们在tbl_employee_audit表中以“ ID =(insert ID)的新雇员在(insert date)添加 *"的格式记录这些更改。看起来很简单...
正如我在这篇文章的标题中所说的,我已经开发了一段代码,当我在PHPMyAdmin的SQL选项卡中运行它时,它可以正常工作,但是当我试图将它放入触发器时,我收到一条错误消息,说第2行(即@varID)的语法不正确。
SET @varDate = CURRENT_DATE();
SET @varID = (SELECT emp_ID FROM tbl_employee WHERE emp_ID = (SELECT MAX(emp_ID) FROM tbl_employee));
SET @string1 = 'New employee with ID = ';
SET @string2 = ' was added on ';
SET @var1 = CONCAT(@string1, @varID, @string2, @varDate);
INSERT INTO tbl_employee_audit(audit_data) VALUES (@var1);
我尝试在SQL选项卡中创建自己的触发器,但没有成功,因此我尝试使用“触发器”选项卡中的“创建新触发器”函数。我将触发器命名为“after_employee_insert”,将Table设置为“tbl_employee”,将Time设置为“AFTER”,将Event设置为“INSERT”,并尝试让我的代码在定义框中工作。
1条答案
按热度按时间bcs8qyzn1#
首先,您不需要在触发器中使用查询来获取最新的
emp_ID
,您可以在插入过程中使用NEW.emp_ID
直接获取。“在触发器主体中,OLD和NEW关键字使您能够访问受触发器影响的行中的列。OLD和NEW是MySQL对触发器的扩展;它们不区分大小写。”
请参阅here
第二,在创建新触发器时,请确保使用
DELIMITER $$
更改分隔符。MySQL将第一个;
分号视为CREATE TRIGGER
语句的结尾。最后,请确保以
END$$
而不是END;
结束create trigger语句,因为我们在第一行将分隔符更改为$$
。Fiddle
关于上述Fiddle语法的注意事项:DELIMITER不受PHP驱动程序的支持,因为它不是mysql数据库命令,而是mysql客户端命令。
为删除触发器编写一个类似的触发器,将触发器更改为
AFTER DELETE
和OLD.emp_ID
。