Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Usando o gatilho para garantir que os dados inseridos não ultrapassem o limite


Para uma resposta rápida e boa, você precisa de mais coisas do que forneceu dados de exemplo funcionais, por exemplo

Este acionador bloqueará qualquer tentativa de inserção se o room_size for menor que os assentos somados.

Por favor, leia o final lá eu explico, onde você deve colocar algum trabalho
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 ;

Esquema (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);

Consulta nº 1
SELECT * FROM booked;

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

Visualizar no DB Fiddle

Como você pode ver no exemplo 1 linha é inserida e a segunda, dá uma exceção.

você precisa melhorar a parte onde eu resumo os lugares reservados lá eu faço um

Porque eu não sei absolutamente que critérios de tempo contarão para somar o número completo de assentos. O timestamp agora não faz sentido colocar para testar o gatilho que eu preciso de alguma data.