Mysql
 sql >> база данни >  >> RDS >> Mysql

Използване на тригер, за да се уверите, че вмъкнатите данни не преминават ограничението

За бърз и добър отговор имате нужда от повече неща, отколкото сте предоставили работещи примерни данни например

Този тригер ще блокира всички опити за вмъкване, ако room_size е по-малък от сумираните места.

Моля, прочетете края, там обяснявам, къде трябва да положите малко работа

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 ;

Схема (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);

Заявка №1

SELECT * FROM booked;

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

Преглед на DB Fiddle

Както можете да видите в примера, 1 ред е вмъкнат, а вторият дава изключение.

трябва да подобрите частта, където обобщавам резервираните места, там правя

Тъй като не знам точно какви времеви критерии ще се вземат предвид, за да се сумира пълният брой места. Времето сега няма смисъл да се поставя за тестване на тригера, имам нужда от дата.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Достъпът до Mysql е отказан поради потребителска грешка?

  2. Нарушение на ограничението за интегритет:1048 Колона 'user_id' не може да бъде нулева грешка възниква при присвояване на роли (Laravel 5.3)

  3. Грешки в хибернация в наименувани заявки

  4. Таблица за заявки с амперсанд в името

  5. Грешка в MySQL:Сортирането е прекратено