首页 > 解决方案 > 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 或随机输入的东西如果在它被提交的第二秒就被替换是没有意义的。

标签: mysqltriggers

解决方案


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

  1. 首先,将触发时间从 更改AFTERBEFORE
  2. 其次,改变即将插入的行

和:

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

推荐阅读