Mysql
 sql >> Base de données >  >> RDS >> Mysql

Utilisation du déclencheur pour s'assurer que les données insérées ne dépassent pas la limite

Pour une réponse rapide et bonne, vous avez besoin de plus de choses que vous avez fourni un exemple de données de fonctionnement par exemple

Ce déclencheur bloquera toute tentative d'insertion si le room_size est plus petit que les sièges additionnés.

S'il vous plaît, lisez la fin là, j'explique, où vous devez mettre du travail

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 ;

Schéma (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);

Requête 1

SELECT * FROM booked;

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

Voir sur DB Fiddle

Comme vous pouvez le voir dans l'exemple, 1 ligne est insérée et la seconde donne une exception.

vous devez améliorer la partie où je résume les places réservées, je fais un

Parce que je ne sais pas exactement quels critères de temps compteront pour additionner le nombre total de places. L'horodatage maintenant n'a aucun sens pour tester le déclencheur, j'ai besoin d'une date.