Mysql 使用触发器确保插入的数据不超过限制

Mysql 使用触发器确保插入的数据不超过限制,mysql,triggers,Mysql,Triggers,我想比较表1中的值和表2中的极限值。我尝试使用约束或触发器,但没有任何帮助 如下图所示,有两张桌子 表1有两列保留和可用 这些列中的值来自用户,且不得超过第二个表中的限制 例如,用户可以输入所有列的总和必须小于限制的任何金额 从表1开始,我可以在booked列中输入值,该值可以介于0到表2中的限制之间,但如果达到限制,则无法为该元素添加更多行 create table booked (room_id foreign key (room_id), booked datetime, booke

我想比较表1中的值和表2中的极限值。我尝试使用约束或触发器,但没有任何帮助

如下图所示,有两张桌子 表1有两列保留和可用 这些列中的值来自用户,且不得超过第二个表中的限制

例如,用户可以输入所有列的总和必须小于限制的任何金额

从表1开始,我可以在booked列中输入值,该值可以介于0到表2中的限制之间,但如果达到限制,则无法为该元素添加更多行

create table booked (room_id foreign key (room_id),
   booked datetime, booked_seats int, remaining_seats);

create table rooms ( room_id primary key
   room_size int);
预订座位由用户完成,我有单独的触发器,以确保用户输入正确, 我们需要一个触发器或类似的东西来检查第一张桌子上预定的所有座位的总数,并与第二张桌子上的房间大小进行比较。 如果总和小于将编辑的大小,则返回错误

create trigger test after insert on booked 
begin 
if sum of all (new.booked ) where the id is same > table2.limit then
    ....
end

要快速、准确地回答问题,您需要的东西比您提供的功能示例更多,例如数据

如果房间大小小于合计座位,此触发器将阻止任何插入尝试

请阅读我解释的结尾,你必须在哪里做一些工作

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)


查询#1

SELECT * FROM booked;

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

正如您在示例中看到的,插入了第1行,第二行给出了一个异常

你需要改进我总结那里预定座位的部分,我做了一个

预订的,预定的


因为我完全不知道什么时间标准可以算作完整座位数的总和。现在的时间戳对测试触发器没有意义,我需要一些日期。

对于触发器,我们需要源代码和相关的表来测试它们。而不是image@nbk我已经编辑了问题并插入了这两个表的代码。如果您已经有一个检查触发器,那么请更改它。但是,只要我们没有源代码,我们就应该如何确定要更改的内容。@nbk我已经在问题中添加了代码,即在已登记的insert之后创建触发器测试,如果id相同的所有(new.booked)的和>table2.limit…``在无有效代码的情况下,请添加complte代码。你有另一个问题,因为你看不到你想如何关联桌子房间,因为没有链接字段。完美。。。作为一种魅力…预订的日期时间用作特定时间内的房间,如果有空座位,许多用户可以预订,直到达到限制。请
SELECT * FROM booked;

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