ПРОВЕРЬТЕ, если значения столбцов в таблице составляют до 100 (в процентах) - PullRequest
0 голосов
/ 02 ноября 2019

Я работаю над заданием в MYSQL. В таблице есть столбец, который отслеживает процент комиссии для автора. Значение комиссии в кортежах всегда должно составлять 100

R - это отношение R = {authorid, isbn, комиссия} (authorid, isbn) -> первичный ключ

Таким образом, в кортежи могут входить несколько авторов для каждого из них с разным значением комиссии. Мы должны обеспечить, чтобы комиссия всегда составляла 100, а не меньше или больше. Как мне это реализовать? Мне сказали использовать триггеры для реализации того же самого, однако у меня закончились идеи.

Я могу думать только о триггере, как показано ниже (логика высокого уровня)

SELECT isbn,sum(commission) FROM R GROUP BY isbn 

Я получаю общую комиссию и проверяю, равно ли это значение 100 или нет, а затем отклоняю вставку /обновление на основе этого

Но это означает, что я буду отклонять случаи, когда пользователь хочет вставить 3 кортежа последовательно, где комиссия составляет 20,30,50 соответственно. Это действительный случай. Вставка будет выглядеть так:

INSERT INTO R(authorid,isbn,commission) VALUES (1,2,20)
INSERT INTO R(authorid,isbn,commission) VALUES (2,2,30)
INSERT INTO R(authorid,isbn,commission) VALUES (3,2,50)

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

Я смотрел в Интернете, если что-то подобное уже было решено. Посмотрел документацию по MYSQL и не повезло.

1 Ответ

0 голосов
/ 02 ноября 2019

Вы можете использовать для вставки

этот триггер

DELIMITER $$
CREATE TRIGGER commisiontest
BEFORE INSERT ON R
FOR EACH ROW
BEGIN
  SELECT sum(commission) into @commision FROM R  WHERE isbn = NEw.isbn GROUP BY isbn;
  IF (NEW.commission + @commision) > 100
  THEN
   SIGNAL SQLSTATE '02000' SET MESSAGE_TEXT = 'Warning: commission reaches 100 or above';
  END IF;

END$$
    DELIMITER ;

Это сделало бы это

INSERT INTO R(authorid,isbn,commission) VALUES (3,2,50) 
Error Code: 1643. Warning: commission reaches 100 or above  0.000 sec

Нечто подобное также относится и к обновлению

Так что это предотвратит комиссионные, которые выше 100 процентов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...