我尝试为我的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不作为列名读取 也许有人可以帮助我吗?
答案 0 :(得分:0)
不可能在触发器中执行此操作。通常,您可以使用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
,在其中存储该值,然后将where tglcode = tgl
添加至update
声明。看起来您(或您的前任)对存储在列b
和t
中的变量m
和t
进行了类似的操作。
即使没有更多信息,也很难说这是否是可行的解决方案(或适当的表格设计)。但是您绝对不能像在触发器中那样使用变量kol
。