Mysql
 sql >> Database >  >> RDS >> Mysql

Utilizzo del trigger per assicurarsi che i dati inseriti non superino il limite

Per una risposta rapida e buona hai bisogno di più cose di quante ne hai fornito un esempio funzionante, ad esempio

Questo trigger bloccherà qualsiasi tentativo di inserimento se room_size è inferiore ai posti sommati.

Per favore leggi la fine lì spiego, dove devi mettere del lavoro in

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 ;

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

Richiesta n. 1

SELECT * FROM booked;

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

Visualizza su DB Fiddle

Come puoi vedere nell'esempio 1 riga è inserita e la seconda fa eccezione.

devi migliorare la parte in cui riassumo i posti prenotati lì faccio un

Perché non so assolutamente quale criterio di tempo conterà per sommare il numero completo dei posti. Il timestamp ora non ha senso per testare il trigger ho bisogno di una data.