sql >> Databasteknik >  >> RDS >> Mysql

Använder trigger för att se till att infogade data inte överskrider gränsen

För ett snabbt och bra svar behöver du fler saker än du tillhandahöll ett fungerande exempeldata till exempel

Denna utlösare kommer att blockera alla försök att infoga om room_size är mindre än de summerade platserna.

Vänligen läs slutet där förklarar jag, där du måste lägga lite arbete

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

Fråga #1

SELECT * FROM booked;

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

Visa på DB Fiddle

Som du kan se i exemplet infogas 1 rad och den andra ger ett undantag.

du måste förbättra delen där jag summerar de bokade platserna där gör jag en

Eftersom jag inte vet exakt vilka tidskriterier som kommer att räknas för att summera hela antalet platser. Tidsstämpeln nu är meningslös för att testa triggern jag behöver ett datum.




  1. MySQL importera databas men ignorera specifik tabell

  2. Avancerad MySql-fråga:Uppdatera tabell med information från en annan tabell

  3. UTF-8 problem med tinymce?

  4. Ska jag skicka min $mysqli-variabel till varje funktion?