Использование триггера, чтобы убедиться, что введенные данные не выходят за пределы - PullRequest
0 голосов
/ 19 апреля 2020

Я хочу сравнить сумму значений в таблице 1 с предельным значением в таблице 2. Я пытался с ограничением или триггерами, но не помогло справиться предел для второй таблицы ..

В качестве примера пользователь может ввести любую сумму, в которой сумма всех столбцов должна быть меньше, чем предел

Начиная с таблицы 1, я могу ввести значение в забронированный столбец, который может быть между 0 и пределом в таблице 2, но если предел достигнут, он не может добавить больше строк для этого элемента

create table booked (room_id foreign key (room_id),
   booked datetime, booked_seats int, remaining_seats);

create table rooms ( room_id primary key
   room_size int);

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

create trigger test after insert on booked 
begin 
if sum of all (new.booked ) where the id is same > table2.limit then
    ....
end

I used trigger to compare values but it did not work

1 Ответ

0 голосов
/ 19 апреля 2020

Для быстрого и качественного ответа вам нужно больше вещей, чем вы предоставили, например, данные действующего примера.

Этот триггер блокирует любые попытки вставки, если размер room_size меньше суммируемых мест.

Пожалуйста, прочитайте конец, который я объясняю, где вы должны поместить некоторую работу в

DELIMITER $$
CREATE TRIGGER check_roomsize_Before_Insert BEFORE insert on booked 
FOR EACH ROW
begin 
    if (SELECT SUM(booked_seats) + NEW.booked_seats FROM booked  WHERE room_id  = NEW.room_id  AND booked  = NEW.booked  GROUP BY room_id) 
        > (select room_size from rooms where rooms.room_id= new.room_id) then
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Roomsize too smal!';
    end if;
END$$
DELIMITER ;

Схема (MySQL v5.7)

create table rooms ( room_id int primary key,
   room_size int);

 create table booked (room_id int,
   booked datetime, booked_seats int, remaining_seats int,    CONSTRAINT fk_category
    FOREIGN KEY (room_id) 
        REFERENCES rooms(room_id));

INSERT INTO rooms VALUES ( 1,5);

DELIMITER $$
CREATE TRIGGER check_roomsize_Before_Insert BEFORE insert on booked 
FOR EACH ROW
begin 
    if (SELECT SUM(booked_seats) + NEW.booked_seats FROM booked  WHERE room_id  = NEW.room_id  AND booked  = NEW.booked  GROUP BY room_id) 
        > (select room_size from rooms where rooms.room_id= new.room_id) then
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Roomsize too smal!';
    end if;
END$$
DELIMITER ;

INSERT INTO booked VALUES (1,now(),3,2);
#INSERT INTO booked VALUES (1,now(),3,0);

Запрос # 1

SELECT * FROM booked;

| room_id | booked              | booked_seats | remaining_seats |
| ------- | ------------------- | ------------ | --------------- |
| 1       | 2020-04-19 20:04:07 | 3            | 2               |

Просмотр на БД Fiddle

Как вы можете видеть в строка примера 1 вставлена, а вторая дает исключение.

вам нужно улучшить ту часть, где я суммирую забронированные места, я делаю

И забронировано = НОВОЕ. забронировано

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

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