#mysql
#mysql
Вопрос:
Кто-нибудь может увидеть, что не так с этим кодом?
Все работало нормально, пока я не добавил триггер для вычисления разницы между двумя датами. Прежде всего, я изменил таблицу на всякий случай, чтобы кому-нибудь было интересно.
ALTER TABLE bookings
ADD COLUMN TheDuration varchar(10);
Тогда мои триггеры следующие…
РАЗДЕЛИТЕЛЬ //
CREATE TRIGGER check_licence /*This trigger will approve customers with a valid licence */
BEFORE UPDATE ON customers
FOR EACH ROW
BEGIN
SET NEW.Status = CASE WHEN NEW.valid_licence = 'Yes'
THEN 'Approved'
ELSE 'Unapproved' /*So if a Customer has a valid licence, He will be automatically approved. */
/*But if he doesn't he will become unapproved[WORKING]*/
SET NEW.TheDuration = DATEDIFF(NEW.bookings.end_date, NEW.bookings.start_date) -- -- TO CALCULATE DURATION BETWEEN 2 DATES
END;
//
DELIMITER ;
Проблема заключается в
SET NEW.TheDuration = DATEDIFF(NEW.bookings.end_date, NEW.bookings.start_date) -- -- TO CALCULATE DURATION BETWEEN 2 DATES
Поскольку все работало до того, как я добавил это.
То же самое здесь…
DELIMITER //
CREATE TRIGGER Carperperson /* This Trigger Blocks a customer from renting two cars on the same name twice on one day. */
BEFORE INSERT ON bookings /*E.g. Mr.ABC cannot rent a Ford and a Nissan on the same day. Has to return first car first.[WORKING]*/
FOR EACH ROW
BEGIN
IF EXISTS (
SELECT 1
FROM bookings
WHERE NEW.customer_id = bookings.customer_id
AND ((new.start_date >= bookings.start_date
and new.start_date < bookings.end_date)
or (new.end_date > bookings.start_date
and new.end_date < bookings.end_date))
) THEN
SIGNAL SQLSTATE '45000'
set message_text='You can only book one car per single customer a day!' ; /* This triggers only allows to rent a car for 7 days, not more, not less[WORKING]*/
END IF;
IF ( NEW.end_date > NEW.start_date INTERVAL 7 DAY ) THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = '7 is the maximum. Please choose an earlier date.'; /*The end_date is more than seven days after start_date*/
END IF;
SET NEW.TheDuration = DATEDIFF(NEW.bookings.end_date, NEW.bookings.start_date) -- -- TO CALCULATE DURATION BETWEEN 2 DATES
END;
//
DELIMITER ;
Проблема заключается внутри…
SET NEW.TheDuration = DATEDIFF(NEW.bookings.end_date, NEW.bookings.start_date) -- -- TO CALCULATE DURATION BETWEEN 2 DATES
Комментарии:
1. Удалите
bookings
вnew.bookings.columnname
. (new
уже ссылается на эту таблицу, как и в остальной части вашего кода).2. Какой триггер вы имеете в виду, 1-й или 2-й
3. или я должен сказать, какую строку кода вы имеете в виду.
4. Ну, я имею в виду везде, где вы это делаете (что, если я правильно понимаю, относится именно к datediff-параметрам). Правильный синтаксис —
new.columnname
, неnew.tablename.columnname
. Для второго триггера он должен делать то, что, я думаю, вы пытаетесь сделать, для первого триггера это сработает, только если в вашей таблицеcustomers
есть столбцы TheDuration, end_date и start_date (и если это то, чего вы пытаетесь достичь).