如何使触发器 return 成为一个值?
How can I make the trigger return a value?
我有一个 'roomstate' table 代表我不断更新的状态。
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
----------------------------------------------------------------
由于以上table不断更新,已有内容可能再次变为NULL
我想在另一个 table 中记录更新此内容。
示例:
--------------------------------------------------------------------------------------
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 table 但 Trigger 不起作用...
select * from ROOMSTATElog;
----------------------------------
RoomstateLOG_ID ROOM_ID CUst_ID Datetime
NULL NULL NULL NULL
-------------------------------------
我做错了什么?
问题似乎出在您的触发器声明中。改成如下 -
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
我有一个 'roomstate' table 代表我不断更新的状态。
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
----------------------------------------------------------------
由于以上table不断更新,已有内容可能再次变为NULL
我想在另一个 table 中记录更新此内容。
示例:
--------------------------------------------------------------------------------------
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 table 但 Trigger 不起作用...
select * from ROOMSTATElog;
----------------------------------
RoomstateLOG_ID ROOM_ID CUst_ID Datetime
NULL NULL NULL NULL
-------------------------------------
我做错了什么?
问题似乎出在您的触发器声明中。改成如下 -
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