Проблема с триггером MySQL. Как это починить? ОШИБКА 1442 - PullRequest
0 голосов
/ 14 мая 2019

Я не знаю, как заставить работать триггер.Мне уже удалось сделать это без ошибок, но теперь у меня есть проблема из заголовка.

Вот фотография схемы данной базы данных:

Большое спасибо за любую помощь или идеи!


/* 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 Ответ

0 голосов
/ 14 мая 2019

Ваша ошибка говорит сама за себя: вы не можете обновить (строки в) ту же таблицу, для которой вы создали свой триггер. Однако вы можете изменить строку, которая будет вставлена:

  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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...