mysql - MySQL 触发器问题。如何修复它?错误 1442
问题描述
我不知道如何使触发器工作。我已经设法让它顺利通过,但现在我遇到了标题的问题。
非常感谢任何帮助或想法!
/* Trigger do liczenia Total w Platnosciach */
DELIMITER //
CREATE TRIGGER t_Payments AFTER INSERT ON Payments
FOR EACH ROW
BEGIN
/* Ciagniemy numer rezerwacji (ZALOZENIE: TYLKO JEDNO ZRODLO ROBIENIA REZERWACJI) */
SET @bookID=0;
SELECT b.BookID INTO @bookID
FROM Bookings b
ORDER BY b.BookID DESC
LIMIT 1;
/* Calosc Pokoju */
SET @room=0;
SELECT
TRUNCATE((DATEDIFF(b.DepDate,b.ArrDate)*r.Price),2) INTO @room
FROM Rooms r
INNER JOIN Bookings b ON r.RoomID = b.RoomID
WHERE
b.BookID = @bookID;
/* Calosc Uslug */
SET @serv=0;
SELECT
TRUNCATE(SUM(si.price),2) INTO @serv
FROM Bookings b
INNER JOIN Services se ON b.BookID = se.BookID
INNER JOIN ServInfo si ON se.code = si.code
WHERE
b.BookID = @bookID;
/* Kod wbicia w Payments Total*/
UPDATE Payments
SET Total=((@room)+(@serv))
WHERE PaymentID=@bookID;
END //
DELIMITER ;
错误 1442 (HY000):无法更新存储函数/触发器中的表“付款”,因为它已被调用此存储函数/触发器的语句使用。
触发器应该计算预订将花费多少。
稍后我将首先尝试使数据的非常 INPUT 成为不可能,因为输入 0 或随机输入的东西如果在它被提交的第二秒就被替换是没有意义的。
解决方案
您的错误说明了一切:您无法更新(行)您为其创建触发器的同一个表。但是,您可以通过以下方式修改即将插入的行:
- 首先,将触发时间从 更改
AFTER
为BEFORE
- 其次,改变即将插入的行
和:
CREATE TRIGGER t_Payments BEFORE INSERT ON Payments
FOR EACH ROW
BEGIN
-- Your magic here
SET NEW.Total = ((@room)+(@serv));
END
推荐阅读
- javascript - 想要在鼠标滚轮滚动 Nuxt js 中水平滚动
- batch-file - 设置变量 2 等于变量 1
- python - 如何预处理小于 256 x 256 的 ImageNet 数据?
- qt - QML TableView 和 Headerview 与 QSortFilterProxyModel
- javascript - 仅更新反应中一项的状态
- r - 无法在 Linux Mint 18 上更新 R
- python-3.x - 对象检测应用程序卡在 RingBuffer - 分配了 4 个缓冲区
- jenkins - Groovy 3 和 Jenkins 嵌入式脚本?
- spring-boot - 不知道如何将连接面包含到多模块 gradle 构建中
- bash - 用于增加每月日期范围的 Bash 脚本