一系列语句/变量在MySQL中运行时有效,但在PHPMyAdmin中无效

8ljdwjyq  于 2022-11-09  发布在  PHP
关注(0)|答案(1)|浏览(135)

我试图为一个家庭作业创建几个触发器,这个作业看起来很简单,但是我遇到了一个又一个问题。我自己和我的同学们被要求在PHPMyAdmin中创建一个在线食品订购数据库。作为一门入门课程,这是非常基本的东西,几年前我在以前的一个机构上过SQL课程,所以我现在回想起来了。
尽管我以前有过经验,我以前从来没有处理过触发器,也没有使用过PHPMyAdmin,但是我正在习惯它。我的数据库有8个表,但是在这种情况下,只有两个表是tbl_employeetbl_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”,并尝试让我的代码在定义框中工作。

bcs8qyzn

bcs8qyzn1#

首先,您不需要在触发器中使用查询来获取最新的emp_ID,您可以在插入过程中使用NEW.emp_ID直接获取。
“在触发器主体中,OLD和NEW关键字使您能够访问受触发器影响的行中的列。OLD和NEW是MySQL对触发器的扩展;它们不区分大小写。”
请参阅here
第二,在创建新触发器时,请确保使用DELIMITER $$更改分隔符。MySQL将第一个;分号视为CREATE TRIGGER语句的结尾。
最后,请确保以END$$而不是END;结束create trigger语句,因为我们在第一行将分隔符更改为$$

DELIMITER $$
CREATE TRIGGER after_employee_insert AFTER INSERT
ON tbl_employee
FOR EACH ROW
BEGIN
  SET @var1 = CONCAT('New employee with ID = ', NEW.emp_ID, ' was added on ',
  CURRENT_DATE());
  INSERT INTO tbl_employee_audit
              (audit_data)
  VALUES      (@var1);
END$$
DELIMITER ;

Fiddle
关于上述Fiddle语法的注意事项:DELIMITER不受PHP驱动程序的支持,因为它不是mysql数据库命令,而是mysql客户端命令。
为删除触发器编写一个类似的触发器,将触发器更改为AFTER DELETEOLD.emp_ID

相关问题