Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Sử dụng trình kích hoạt để đảm bảo dữ liệu được chèn vào không vượt quá giới hạn

Để 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               |

Xem trên DB Fiddle

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 đó.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tại sao tôi gặp lỗi cú pháp khi sử dụng CAST trong MySQL?

  2. cách kết hợp các bảng có mối quan hệ từ 1 đến nhiều thành 1 dòng bản ghi

  3. Đếm chọn postgresl (*) tốn nhiều thời gian

  4. Cách lấy số ngày trong tháng trong MySQL

  5. Câu lệnh if trong quy trình được lưu trữ MySQL để chọn dữ liệu