sql >> Base de Datos >  >> RDS >> Mysql

Uso del disparador para asegurarse de que los datos insertados no superen el límite

Para una respuesta rápida y buena, necesita más cosas de las que proporcionó, por ejemplo, datos de ejemplo de funcionamiento

Este disparador bloqueará cualquier intento de inserción si room_size es más pequeño que los asientos sumado.

Por favor, lea el final que explico, donde debe trabajar

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 ;

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

Consulta #1

SELECT * FROM booked;

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

Ver en DB Fiddle

Como puede ver en el ejemplo, se inserta 1 fila y la segunda, da una excepción.

necesita mejorar la parte donde resumo los asientos reservados allí hago un

Porque no sé absolutamente qué criterios de tiempo contarán para sumar el número completo de asientos. La marca de tiempo ahora no tiene sentido poner a prueba el activador necesito alguna fecha.