MySQL 触发器问题。如何修复呢?错误 1442

标签 mysql triggers

我不知道如何使触发器工作。我已经设法让它顺利通过,但现在我遇到了标题中的问题。

Here is a photo of a schema of given database:

非常感谢您的帮助或想法!


/* 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):无法更新存储函数/触发器中的表“付款”,因为它已被调用此存储函数/触发器的语句使用。

触发器应该计算预订的费用。

稍后我会尝试让数据的输入变得不可能,因为输入 0 或一些随机的东西是没有意义的,如果它在提交时就会被替换。

最佳答案

您的错误说明了一切:您无法更新为其创建触发器的同一表(其中的行)。但是,您可以通过以下方式修改即将插入的行:

  1. 首先,将触发时间从 AFTER 更改为 BEFORE
  2. 其次,更改要插入的行

与:

CREATE TRIGGER t_Payments BEFORE INSERT ON Payments
FOR EACH ROW
BEGIN
    -- Your magic here
    SET NEW.Total = ((@room)+(@serv));
END

关于MySQL 触发器问题。如何修复呢?错误 1442,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56136713/

相关文章:

php - Laravel 查询生成器 - 查询不工作但在 SQL 控制台中工作

输出表上的 MySQL 子查询

MySQL 更新后自动更新列

php - DELETE FROM 不起作用(mysql)

php - 在提交错误的表单后将选择附加到选项

php - 阻止表更新查询 20 秒。可能的?

postgresql - 如何防止在父表中插入?

mysql - 触发器是基于原子查询的吗?

javascript - Ionic Angular 将数据传递到 PHPfile 并插入 MySQL 数据库

sql - Oracle 11g复合触发器的应用