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               |
    

    DBFiddleで表示

    例でわかるように、1行が挿入され、2行目が例外になります。

    予約した座席を合計する部分を改善する必要があります

    完全な座席数を合計するためにどの時間基準がカウントされるかは絶対にわかりません。現在のタイムスタンプは、トリガーをテストするのに意味がありません。日付が必要です。




    1. Oracle SQL Developerで外部キーを作成する方法は?

    2. データベースへのプリペアドステートメントの挿入-PSQL

    3. OSX Yosemiteのアップグレード後にMySQLサーバーを機能させる方法は?

    4. PHP/MySQL-ナビゲーションメニュー階層の構築