Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Używanie wyzwalacza, aby upewnić się, że wprowadzone dane nie przekraczają limitu

Aby uzyskać szybką i dobrą odpowiedź, potrzebujesz więcej rzeczy niż na przykład podałeś działające przykładowe dane

Ten wyzwalacz zablokuje wszelkie próby wstawienia, jeśli room_size jest mniejszy niż suma miejsc.

Proszę przeczytać koniec, tam wyjaśnię, gdzie trzeba włożyć trochę pracy

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 ;

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

Zapytanie nr 1

SELECT * FROM booked;

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

Wyświetl na DB Fiddle

Jak widać w przykładzie 1 wiersz jest wstawiony, a drugi daje wyjątek.

musisz poprawić część, w której podsumowuję zarezerwowane miejsca, robię

Ponieważ nie wiem dokładnie, jakie kryteria czasowe będą liczyć się do sumy całkowitej liczby miejsc. Znacznik czasu teraz nie ma sensu testować wyzwalacza, potrzebuję jakiejś daty.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Optymalizacja mojego oświadczenia mysql! - RAND() ZBYT WOLNO

  2. Railsy SELECT 40001 SQL_NO_CACHE uruchomione z nieznanego miejsca

  3. Jak usunąć wszystkie tabele MySQL z wiersza poleceń bez uprawnień do bazy danych DROP?

  4. Jak sprawdzić, czy mam niezatwierdzone zapisy w transakcji MySQL?

  5. Policz z LEFT JOIN pokazuje tylko jeden wiersz