【问题标题】:How can I make the trigger return a value?如何让触发器返回一个值?
【发布时间】:2021-08-23 14:52:50
【问题描述】:

我有一个 'roomstate' 表,表示我不断更新的状态。

CREATE TABLE ROOMSTATE
(
    `RoomState_ID`          INT       NOT NULL   AUTO_INCREMENT ,  
    `Room_ID`          INT       NOT NULL    ,
    `RoomState_State`  BOOL      NULL       , 
    `Cust_ID`          INT       NULL   ,
    `Booking_ID`       INT       NULL   ,
    CONSTRAINT  PRIMARY KEY (Roomstate_ID)
);
This table is updated when an employee assigns a room to a customer and shows the status of the rooms.

INSERT INTO ROOMSTATE(Room_ID, RoomState_State, Cust_ID, Booking_ID) 
 (select room_id, '0', null, null from room);



select * from roomstate;

-------------------------------------------------------------------
Roomstate_ID  ROOM_ID  ROOMSTATE_STATE  CUST_ID  BOOKING_ID
     1           1           0           NULL        NULL
     2           2           0           NULL        NULL
     3           3           0           NULL        NULL
     4           4           0           NULL        NULL
     5           5           0           NULL        NULL      
----------------------------------------------------------------

当员工将房间 2 分配给 booking_id 为 2 的客户 1 时会发生这种情况。

select @custid = 2;
select @Bookingid := 2;
select @RoomAloct := 1;

UPDATE roomstate
SET booking_id = @Bookingid, cust_id = @custid, roomstate_state = 1
where roomstate.room_id = @RoomAloct;


select * from roomstate;

-------------------------------------------------------------------
Roomstate_ID  ROOM_ID  ROOMSTATE_STATE  CUST_ID  BOOKING_ID
     1           1           1             2          2
     2           2           0           NULL        NULL
     3           3           0           NULL        NULL
     4           4           0           NULL        NULL
     5           5           0           NULL        NULL      
----------------------------------------------------------------

由于上表不断更新,现有内容可能再次变为NULL。

我想在另一个表中记录更新它。

示例:

--------------------------------------------------------------------------------------
PK_LOGTB  ROOM_ID  ROOMSTATE_STATE  CUST_ID  BOOKING_ID  DATETIME
     1           1           1             2        2      2021-06-06 00:00:00(NOW)
     2           2           1             5        3      2021-06-06 00:00:00(NOW)
     3           3           1             8        4      2021-06-06 00:00:00(NOW)
     4           1           0             2        2      2021-06-07 00:00:00(NOW)
-----------------------------------------------------------------------------------------

所以,我使用了触发器。

CREATE TABLE ROOMSTATElog
(
    `RoomstateLOG_ID`          INT       NOT NULL   AUTO_INCREMENT ,  
    `Room_ID`          INT       NOT NULL    ,
    `Cust_ID`          INT       NULL   ,
    `datetime`       Datetime       NULL   ,
    CONSTRAINT  PRIMARY KEY (Roomstatelog_ID)
);


delimiter $$
    create trigger roomstate_trigger
    after update on ROOMSTATElog
    for each row
    begin
        declare room_id int;
        declare cust_id int;
        
        set room_id = new.room_id;
        set cust_id = new.cust_id;
        
        insert into roomstatelog value (room_id,cust_id,now());
        
    end $$
delimiter ;

我更新了 roomstate 表,但 Trigger 不起作用...

select * from ROOMSTATElog;

----------------------------------
RoomstateLOG_ID ROOM_ID CUst_ID Datetime
NULL NULL NULL NULL
-------------------------------------

我做错了什么?

【问题讨论】:

  • 代码中没有错误信息。

标签: mysql sql triggers


【解决方案1】:

看来问题出在您的触发器声明中。改成如下-

create trigger roomstate_trigger
    after update on ROOMSTATE  -- instead of ROOMSTATElog

对于您遇到的新错误,您也可以指定列名 -

Insert into roomstatelog 
(`Room_ID`,`Cust_ID`,`datetime`) -- you may also consider renaming datetime column to something else so that it doesn't clash with type DateTime
Values (room_id,cust_id,now()); -- notice VALUES instead of Value

【讨论】:

  • 谢谢,效果很好 但是在设置触发器和更新原始表时我遇到了另一个问题。错误1136:列数与第1行的值计数不匹配。这意味着行数不匹配,我不确定是触发器错误还是日志表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-17
  • 2011-02-10
  • 1970-01-01
  • 2013-07-02
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
相关资源
最近更新 更多