Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Verwenden von Triggern, um sicherzustellen, dass die eingefügten Daten die Grenze nicht überschreiten

Für eine schnelle und gute Antwort braucht man mehr Dinge als beispielsweise eine funktionierende Beispieldatei

Dieser Trigger blockiert alle Einfügungsversuche, wenn room_size kleiner ist als die Summe der Sitze.

Bitte lesen Sie das Ende dort, wo ich erklären muss, wo Sie etwas Arbeit investieren müssen

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

Abfrage 1

SELECT * FROM booked;

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

Auf DB Fiddle ansehen

Wie Sie im Beispiel sehen können, wird 1 Zeile eingefügt und die zweite gibt eine Ausnahme.

Sie müssen den Teil verbessern, in dem ich die gebuchten Plätze zusammenfasse, dort mache ich ein

Weil ich nicht genau weiß, welche Zeitkriterien zählen, um die vollständige Sitzplatzanzahl zu summieren. Der jetzige Zeitstempel macht keinen Sinn, um den Trigger zu testen. Ich brauche ein Datum.