mysql 如何在触发器中使用变量作为列名

hc8w905p  于 2023-03-28  发布在  Mysql
关注(0)|答案(1)|浏览(199)

我试图创建一些触发器为我的web数据库,但没有工作代码为我的触发器在这里的问题

BEGIN
DECLARE t INT;
DECLARE b INT;
DECLARE ir INT;
DECLARE tgl INT;
DECLARE kol VARCHAR(3);


SET tgl = "(SELECT RIGHT(booking_checkin, 2) FROM pt_bookings WHERE booking_id = NEW.booking.id)";

SET ir = "(SELECT booked_room_id FROM pt_booked_rooms WHERE booking_id = NEW.booking.id)";

SET b = "(SELECT MID(booking_checkin , 6,2) FROM pt_bookings WHERE booking_id = NEW.booking_id)";

SET t = "SELECT IF((SELECT LEFT(booking_checkin, 4) FROM pt_bookings WHERE booking_id = NEW.booking_id) = 2019 ,'0','1')";

SET kol = "d" + tgl;

UPDATE pt_rooms_availabilities
set kol = kol + (SELECT `booking_nights` FROM `pt_bookings` WHERE booking_id = NEW.booking_id)
WHERE room_id = ir AND y = t AND m= b; 
END

问题是var kol不读作为一个列的名称,也许有人可以帮助我?

3bygqnnd

3bygqnnd1#

在触发器中是不可能做到这一点的。一般来说,你可以使用dynamic sql来使用变量列名,例如Dynamic conversion of string into column name。然而,这是not allowed in stored functions or triggers
您可以使用if then else为每种情况创建不同的insert语句,类似于if tgl = 7 then update ... set d7 = d7 + ... elseif tgl = 122 then update ... set d122 = d122 + ...
但是在大多数情况下,您可以并且应该通过表设计来避免这种情况。
我不知道你到底想做什么,但你可以只在表中添加一列tglcode,在那里存储该值,然后在update语句中添加where tglcode = tgl。看起来好像你(或你的前任)对存储在列mt中的变量bt做了类似的事情。
如果没有更多的信息,很难说这是否是一个可行的解决方案(或适当的表设计),但你绝对不能像在触发器中那样使用变量kol

相关问题