Để có câu trả lời nhanh và tốt, bạn cần nhiều thứ hơn là bạn đã cung cấp dữ liệu ví dụ về chức năng hoạt động chẳng hạn
Trigger này sẽ chặn mọi nỗ lực chèn nếu room_size nhỏ hơn số ghế đã được tính hết.
Vui lòng đọc phần cuối mà tôi giải thích, nơi bạn phải đặt một số công việc vào
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 ;
Giản đồ (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);
Truy vấn số 1
SELECT * FROM booked;
| room_id | booked | booked_seats | remaining_seats |
| ------- | ------------------- | ------------ | --------------- |
| 1 | 2020-04-19 20:04:07 | 3 | 2 |
Như bạn có thể thấy trong ví dụ, 1 hàng được chèn và hàng thứ hai đưa ra một ngoại lệ.
bạn cần cải thiện phần mà tôi tổng hợp các chỗ đã đặt ở đó tôi sẽ tạo
Bởi vì tôi hoàn toàn không biết tiêu chí thời gian nào sẽ được tính để tính tổng số ghế đầy đủ. Dấu thời gian bây giờ không có ý nghĩa gì để kiểm tra trình kích hoạt mà tôi cần một ngày nào đó.