sql >> Databáze >  >> RDS >> Mysql

Pomocí spouštěče se ujistěte, že vložená data nepřekročí limit

Pro rychlou a dobrou odpověď potřebujete více věcí, než jste poskytli například funkční příklad dat

Tento Trigger zablokuje všechny pokusy o vložení, pokud je room_size menší než součet míst.

Přečtěte si prosím konec, kde vysvětluji, kde si musíte dát práci

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 ;

Schéma (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);

Dotaz č. 1

SELECT * FROM booked;

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

Zobrazit na DB Fiddle

Jak můžete vidět v příkladu, 1 řádek je vložen a druhý dává výjimku.

musíte vylepšit část, kde sčítám rezervovaná místa, kde dělám

Protože absolutně nevím, jaká časová kritéria se budou počítat pro sečtení kompletního počtu sedadel. Časové razítko teď nemá smysl dávat na testování spouštěče. Potřebuji nějaké datum.




  1. Zápis poddotazu pomocí Zend DB

  2. Laravel - Querybuilder se spojením a spojením

  3. Je nějaký problém s instalací psycopg2 ve virtualenv na MacOS catalina s nainstalovaným PostgreSQL 12.1?

  4. Entity Framework a Oracle:Nelze vložit VARCHAR2> 1 999 znaků