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

Brug af trigger for at sikre, at indsatte data ikke krydser grænsen

For et hurtigt og godt svar har du brug for flere ting, end du har givet et fungerende eksempeldata f.eks.

Denne trigger vil blokere ethvert forsøg på at indsætte, hvis room_size er mindre end de opsummerede pladser.

Læs venligst slutningen, der forklarer jeg, hvor du skal lægge noget arbejde i

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 ;

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

Forespørgsel #1

SELECT * FROM booked;

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

Se på DB Fiddle

Som du kan se i eksemplet er 1 række indsat, og den anden giver en undtagelse.

du skal forbedre den del, hvor jeg opsummerer de reserverede pladser, der laver jeg en

For jeg ved ikke helt, hvilke tidskriterier der tæller for at summere det fulde antal pladser. Nu-tidsstemplet giver ingen mening at teste triggeren jeg har brug for en dato.




  1. hvordan man indsætter arabisk i mysql fra asp.net C#

  2. mysqldb python undslipper? eller %s?

  3. MySQL-fejl 1153 - Fik en pakke større end 'max_allowed_packet' bytes

  4. Generering af tællinger af åbne billetter over tid, givet åbnede og lukkede datoer