MariaDB触发器开发求助:同步车辆日租价与自动计算租金
MariaDB触发器创建问题求助
我是MariaDB(MySQL分支)触发器新手,在PHPMyAdmin的SQL命令行创建触发器时遇到错误,现有两张表:Coches(车辆表)和Alquileres(租赁表),需求如下:
- 插入租赁记录时,自动从
Coches表同步车辆日租价(prd)到Alquileres表 - 更新租赁结束日期(fecf)时,自动计算总租金(prf)
表结构
Alquileres表
| id | fechi | fechf | prd | prf | matr |
|---|---|---|---|---|---|
| 1 | 02/02/2020 | 03/02/2020 | 80 | 160 | 11e45 |
| 2 | 02/05/2020 | null | 55 | null | 41y45 |
| 3 | 02/07/2021 | 03/07/2020 | 214 | 428 | 34t56 |
| 4 | 02/01/2020 | null | 81 | null | 22r16 |
| 5 | 02/05/2021 | 02/05/2021 | 214 | 214 | 34t56 |
fechi:租赁起始日期fechf:租赁结束日期prd:日租价prf:总租金matr:车牌号
Coches表
| id | matr | prd |
|---|---|---|
| 1 | 11e45 | 80 |
| 2 | 41y45 | 55 |
| 3 | 34t56 | 214 |
| 4 | 22r16 | 81 |
尝试的触发器代码及错误
1. 同步日租价的BEFORE INSERT触发器
尝试代码:
CREATE TRIGGER preciodiario BEFORE INSERT ON Alquileres FOR EACH ROW BEGIN SET new.prd = (SELECT Coches.prd FROM Coches WHERE Coches.mat = new.mat) END
错误信息:#1064 - 第6行'END'附近存在语法错误
2. 计算总租金的BEFORE UPDATE触发器
尝试代码:
CREATE TRIGGER calculoautomatico BEFORE UPDATE ON Alquileres FOR EACH ROW BEGIN IF new.fecf IS NOT NULL THEN SET new.prf = (datediff(Alquileres.feci,new.fecf)+1)*Alquileres.prd END IF END
错误信息:#1064 - 第7行'END IF'和'END'附近存在语法错误
修正后的触发器代码
修正后的同步日租价触发器
DELIMITER // CREATE TRIGGER preciodiario BEFORE INSERT ON Alquileres FOR EACH ROW BEGIN SET new.prd = (SELECT prd FROM Coches WHERE Coches.matr = new.matr); END // DELIMITER ;
错误原因及修正点:
- 字段名错误:原代码中使用
mat,实际表字段为matr - 语句末尾缺少分号,MySQL无法识别语句结束
- 添加
DELIMITER //临时修改分隔符,避免触发器体内的分号被提前解析
修正后的计算总租金触发器
DELIMITER // CREATE TRIGGER calculoautomatico BEFORE UPDATE ON Alquileres FOR EACH ROW BEGIN IF new.fecf IS NOT NULL THEN SET new.prf = (DATEDIFF(new.fecf, new.fechi) + 1) * new.prd; END IF; END // DELIMITER ;
错误原因及修正点:
- 字段引用错误:触发器中需用
new./old.访问当前行字段,不能直接用表名 DATEDIFF参数顺序错误:函数格式为DATEDIFF(结束日期, 起始日期),确保天数计算为正- 语句末尾缺少分号,导致语法解析失败
内容的提问来源于stack exchange,提问作者LEO FIORENTINO
相关产品推荐
相关产品推荐

