mysql - 无法从触发器内的 SELECT 查询获取值

标签 mysql triggers

我正在编写一个触发器,以在插入另一个表后更新表中的行。以下是表格的脚本:

表格inv_cost

CREATE TABLE inv_cost (
  Username varchar(20) NOT NULL DEFAULT '',
  MachineType varchar(2) NOT NULL,
  Cost smallint(4) NOT NULL DEFAULT '0',
  PRIMARY KEY (Username,MachineType),
)

表格调查

CREATE TABLE investigation (
  Username varchar(20) NOT NULL,
  MachineType varchar(2) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
DELIMITER ;;
CREATE TRIGGER TRG1 AFTER INSERT ON investigation FOR EACH ROW BEGIN
    DECLARE cost INT DEFAULT 0;
    SET cost = (SELECT Cost FROM inv_cost WHERE Username = NEW.Username AND MachineType = NEW.MachineType);
    UPDATE test SET Balance = Balance - cost WHERE Username = New.Username;
END;;
DELIMITER ;

调查员

CREATE TABLE test (
  ID int(10) unsigned NOT NULL AUTO_INCREMENT,
  Username varchar(20) NOT NULL DEFAULT '',
  Balance smallint(6) DEFAULT NULL,
  PRIMARY KEY (ID)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
DELIMITER ;;
CREATE TRIGGER TRG2 AFTER UPDATE ON test FOR EACH ROW BEGIN
    IF NEW.Balance > OLD.Balance THEN
        INSERT INTO payments SET Username = NEW.Username, PaymentOn = NOW(), Amount = NEW.Balance - OLD.Balance;
    END IF;
END;;
DELIMITER ;

触发器 TRG1 的问题在于,它不会根据 SELECT 语句计算变量 cost 的值,并且始终采用值 0 或设置为的任何值其声明中的 DEFAULT。下一行的 UPDATE 查询运行良好(无论 cost 从其声明中获取什么值,或者如果为它分配了一个 const 值,例如 SET cost = 100;)。单独运行的 SELECT 给出所需的 Cost 值。

这段代码有什么问题?

提前致谢。

最佳答案

您必须使用语法SELECT 字段 FROM 表 WHERE 条件 INTO 变量

DROP TRIGGER TRG1 IF EXISTS;
DELIMITER $$
 CREATE TRIGGER TRG1
 AFTER INSERT ON investigation
 FOR EACH ROW BEGIN
      DECLARE cst smallint;
      SELECT Cost FROM inv_cost WHERE Username = NEW.Username AND MachineType = NEW.MachineType INTO cst;
      UPDATE test SET Balance = Balance - cst WHERE Username = New.Username;
 END$$
 DELIMITER ;

关于mysql - 无法从触发器内的 SELECT 查询获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9977690/

相关文章:

查询中的 MySQL ORDER BY

php - 如何使用数组从数据库中获取数据

button - 如何从 ui 操作触发 ServiceNow 工作流程?

mysql - 触发器导致 MySQL Error 1054 Unknown Column

php - 将多个 XML 文件(具有相同元素)导入到合并的 MySQL 表中

mysql - CSV数据导入及数据处理

mysql - ActiveRecord 组计数为零

angularjs - 单击表格行以触发 Angularjs 中的复选框单击

MySQL 检查触发器内的事件事务

mysql - 使用Mysql在两个服务器之间同步表数据