Синтаксические ошибки при попытке написать MySQL триггер, чтобы заменить ограничение CHECK на phpmyadmin - PullRequest
1 голос
/ 09 апреля 2019

Я пытаюсь создать триггер MySQL, который будет действовать как ограничение CHECK, поскольку он не поддерживается в используемой версии MySQL.

По сути, я делаю базу данных для библиотеки, где табличный книжный кредит - это запись всех займов, которые когда-либо были сделаны.

книжный кредит имеет 4 колонки:
- borrowerNo: идентификатор заемщика
- copyNo: идентификатор книги, которая была арендована
- dateOut: дата аренды книги
- dateDue: дата выхода книги, всегда 14 дней после даты выхода

Я пытаюсь установить ограничение, когда заемщик не может арендовать более 3 книг одновременно. Вот мой код для триггера:

CREATE TRIGGER maxbooks 
BEFORE INSERT OR UPDATE
ON bookloan FOR EACH ROW
BEGIN
IF COUNT(SELECT * FROM bookloan WHERE borrowerNo = NEW.borrowerNo AND dateOut <= NEW.dateOut AND dateDue > NEW.dateOut) >= 3 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Maximum number of book rentals has been reached';
END IF;
END;

Вот сообщение об ошибке, которое я получаю от MySQL:

# 1064 - у вас ошибка в синтаксисе SQL; проверьте руководство, которое соответствует вашей версии сервера MySQL для правильного использования синтаксиса около 'ЕСЛИ СЧЕТ (ВЫБЕРИТЕ * ИЗ БУКЛОНА, ГДЕ ЗАМЕСТИТЕЛЬ NEW.borrowerNo AND dateOut <= 'в строке 4 </p>

Я предполагаю, что ошибка из-за функции Count(), но не знаю, как я могу отформатировать ее, чтобы получить нужную информацию.

Спасибо!

1 Ответ

0 голосов
/ 09 апреля 2019

Попробуйте использовать count(*) вместо того, чтобы использовать его в возвращаемых результатах запроса. Как показано ниже:

CREATE TRIGGER maxbooks 
BEFORE INSERT OR UPDATE
ON bookloan FOR EACH ROW
BEGIN
IF (SELECT COUNT(*) FROM bookloan WHERE borrowerNo = NEW.borrowerNo AND dateOut <= 
NEW.dateOut AND dateDue > NEW.dateOut) >= 3 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Maximum number of book rentals has been reached';
END IF;
END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...