【发布时间】: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。我真的做错了吗?