首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP中MySQL触发器的语法问题

问PHP中MySQL触发器的语法问题
EN

Stack Overflow用户
提问于 2014-01-11 21:16:19
回答 1查看 54关注 0票数 0

我很难让这个扳机起作用。以下是代码:

代码语言:javascript
复制
 BEGIN 

DECLARE newprice double;
DECLARE id int;
DECLARE rentdate DATE;

SET id := RESERVATION.RES_ID;
SET rentdate := "SELECT RES_RENT_DATE
FROM RESERVATION 
WHERE RES_ID = id";

SET newprice := (NEW.RES_RETURN_DATE - rentdate)*RESERVATION.RES_CAR_PPD;

UPDATE RESERVATION
SET RESERVATION.RES_TOTAL_PRICE = newprice WHERE  
RESERVATION.RES_ID = id;

END

基本上,我想做的是更新总价格时,汽车的返回日期被改变。触发器应在更新返回日期时执行。更新时会给出错误:#1109 --字段列表中的未知表“预约”。我不知道我做错了什么。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-11 21:52:46

有几个问题:

  1. 不能像在SET id := RESERVATION.RES_ID;中那样任意引用表列。您只能在有效的SQL语句(例如SELECT)中或通过NEW/OLD引用列。
  2. 您不能在定义触发器的同一表上发出DML语句(在您的例子中是UPADTE)。这种变异行为在MySQL中被禁止。
  3. 如果我正确理解并且您需要的所有值都在同一行中,则只需使用BEFORE触发器即可。见下面的例子。

你的扳机可以归结为这样

代码语言:javascript
复制
CREATE TRIGGER tg_bu_reservation
BEFORE UPDATE ON reservation
FOR EACH ROW
  SET NEW.res_total_price = (NEW.res_return_date - NEW.res_rent_date) * NEW.res_car_ppd;

注释:,因为它是一个语句触发器,所以在BEGIN...END块中不需要改变DELIMITER。

这是SQLFiddle演示

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21067984

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档