【问题标题】:how to use variable as a column name in trigger如何在触发器中使用变量作为列名
【发布时间】:2019-07-02 06:05:18
【问题描述】:

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

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 不作为列名读取 也许有人可以帮助我?

【问题讨论】:

    标签: mysql variables triggers columnname


    【解决方案1】:

    不可能在触发器中执行此操作。通常,您可以使用 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 语句中。看起来您(或您的前任)使用存储在列 mt 中的变量 bt 做了类似的事情。

    如果没有更多信息,很难说这是否是解决您的问题的可行解决方案(或适当的表格设计)。但是你绝对不能像在触发器中那样使用变量kol

    【讨论】:

    • 哦,我看到了我认为我应该尝试使用动态 sql 的问题,感谢您的回答
    • 不确定您是否看到它(或者我是否误解了您的评论),但不幸的是您不能在触发器中使用动态 sql(仅在存储过程中)。 (您可以通过存储过程将您的应用程序插入/更新到该表中,这样您就不需要触发器来完成后续工作)。
    • 我的问题解决了我使用存储过程来更新我的表,我认为触发器是唯一的方法,但现在我找到了解决这种情况的两种方法 1-使用存储过程 2-只是欺骗你php代码,它可以工作;)
    猜你喜欢
    • 2016-06-08
    • 2022-06-11
    • 2019-02-24
    • 2021-11-19
    • 2013-11-29
    • 1970-01-01
    • 2023-03-30
    • 2010-12-05
    相关资源
    最近更新 更多