【问题标题】:Cannot fetch a value from a SELECT query inside a trigger无法从触发器内的 SELECT 查询中获取值
【发布时间】:2012-04-02 13:48:53
【问题描述】:

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

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 从其声明中获取的任何值,或者如果它被分配了一个像 SET cost = 100; 这样的 const 值)。 SELECT 运行单独给出所需的 Cost 值。

这段代码有什么问题?

提前致谢。

【问题讨论】:

  • 我试过UPDATE surveyor SET Balance = Balance - NEW.VehicleType WHERE Username = New.Username;,但该行没有被更新。这意味着,我无法从 INSERTed 行中获取 NEW.VehicleType。我真的做错了吗?

标签: mysql triggers


【解决方案1】:

你必须使用sintax SELECT field FROM table WHERE condition INTO variable

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 中返回什么(用新值替换 NEW.Username 和 NEW.MachineType)? - SELECT Cost FROM inv_cost WHERE Username = NEW.Username AND MachineType = NEW.MachineType
  • 它返回一个数值,我存储在 inv_cost 表中的用户名和机器类型。
  • 应该可以。你确定新的触发器已经启动了吗?您是否在添加新触发器之前删除了先前的触发器? (发生在我身上几次)
  • 可能不是。但是,如果我为 cost 变量分配一个常量值,则会反映触发器中的变化。
猜你喜欢
  • 2011-06-29
  • 2013-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-08
相关资源
最近更新 更多