sql >> Database >  >> RDS >> Mysql

Trigger gebruiken om ervoor te zorgen dat ingevoerde gegevens de limiet niet overschrijden

Voor een snel en goed antwoord heb je meer nodig dan dat je bijvoorbeeld een functionerend voorbeeld gegeven hebt

Deze trigger blokkeert alle pogingen om in te voegen als de room_size kleiner is dan de opgesomde stoelen.

Lees alsjeblieft het einde dat ik uitleg, waar je wat werk in moet steken

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

Vraag #1

SELECT * FROM booked;

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

Bekijken op DB Fiddle

Zoals je in het voorbeeld kunt zien, wordt 1 rij ingevoegd en de tweede geeft een uitzondering.

je moet het gedeelte verbeteren waar ik de geboekte stoelen samenvat, daar maak ik een

Omdat ik niet precies weet welke tijdcriteria zullen tellen om het volledige aantal stoelen op te tellen. De nu tijdstempel heeft geen zin om de trigger te testen, ik heb een datum nodig.




  1. Een resultaatkolom hergebruiken in een uitdrukking voor een andere resultaatkolom

  2. IDE voor Pl/SQL-ontwikkeling

  3. MySQL vermenigvuldigen subquery resultaten

  4. ALS bestaat, update dan MySQL