mySQL 使用动态列名的过程更新行

Posted

技术标签:

【中文标题】mySQL 使用动态列名的过程更新行【英文标题】:mySQL updating row with a procedure using a dynamic column name 【发布时间】:2020-06-30 04:54:10 【问题描述】:

我一直在尝试编写一个存储过程,该过程涉及用户输入他们希望存储数据的列,然后输入要存储的数据。到目前为止,这可行,但该列是硬编码的。

CREATE PROCEDURE `cnp_data`.`AddBehavior` (IN StudId INT,
                                           IN ColumnData VARCHAR(45))
BEGIN
    UPDATE `Behavior`
        SET `Lunch` = ColumnData                        
            WHERE `StudentId`=StudId;
END

但我想让Lunch 列可以由用户动态设置。到目前为止,我一直坚持这一点:

CREATE PROCEDURE `cnp_data`.`AddBehavior` (IN StudId INT,
                                           IN ColumnName VARCHAR(45),
                                           IN ColumnData VARCHAR(45))
BEGIN
    SET @Var1=StudId;
    SET @Var2=ColumnName;
    SET @Var3=ColumnData;
    SET @sqlstm = CONCAT("UPDATE `Behavior`
                            SET `",@Var2,"` = ",@Var3,"
                               WHERE `StudentId`= ",@Var1,";");
    PREPARE stmt FROM @sqlstm;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
END

但是当我尝试输入以下 CALL 语句时会引发错误

CALL AddBehavior(19, "AM Snack", "test");

错误代码:1054。“字段列表”中的“测试”列未知

我不明白为什么它试图将@Var3 作为列而不是将其设置为@Var2 列中的数据。

感谢大家的帮助或见解!

【问题讨论】:

尝试在 ",@Var3," 周围添加 ` 字符 非常感谢,这有效。我已经为此苦苦挣扎了太久,我不敢相信这是一个简单的报价错误。谢谢! 不客气。很高兴它修好了! 【参考方案1】:

这行得通,谢谢 Anthony McGrath。

CREATE PROCEDURE `cnp_data`.`AddBehavior` (IN StudId INT,
                                           IN ColumnName VARCHAR(45),
                                           IN ColumnChoice VARCHAR(45))
BEGIN
    SET @Var1=StudId;
    SET @Var2=ColumnName;
    SET @Var3=ColumnChoice;
    SET @Var4=CURRENT_DATE;
    SET @sqlstm = CONCAT("UPDATE `Behavior`
        SET `",@Var2,"` = """,@Var3,"""
            WHERE `StudentId`= ",@Var1," AND CurrentDate=""",@Var4,""";");
    PREPARE stmt FROM @sqlstm;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
END

【讨论】:

以上是关于mySQL 使用动态列名的过程更新行的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 使用动态行值作为列名

如何动态地将行转换为列,并为每列使用不同的列名

SQL 动态列和更新多列

具有可变列名的动态更新语句

更新查询的动态列名

foreach属性-动态-mybatis中使用map类型参数,其中key为列名,value为列值