近日开始对数据库开始涉猎,在编写数据库操作类调试过程中遇到一个问题:
mysql> select * from environmental_variable_table where key='temperature' AND dev_ip='192.168.1.1';
1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'key='temperature' AND dev_ip='192.168.1.1'' at line 1
mysql> 
 
部分涉及代码如下:
struct environmental_variable_table
{
    std::string station_num;
    std::string dev_type;
    std::string dev_nid;
    std::string dev_sn;
    std::string dev_ip;
    std::string key;
    std::string m_value;
    std::string value_desc;
};
REFLECTION(environmental_variable_table, station_num, dev_type, dev_nid, dev_sn, dev_ip, key, m_value, value_desc)
class CEnvironmentalVariableTable
{
private:
    dbng<mysql> m_mysql;
    bool connectDB()
    {
        return m_mysql.connect(MYSQL_IP, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE);
    }
public:
    CEnvironmentalVariableTable()
    {
        if (!connectDB())
        {
            throw std::runtime_error("Failed to connect to the database.");
        }
    }
    void addData(const environmental_variable_table &envVar)
    {
        if (!m_mysql.insert(envVar))
        {
            throw std::runtime_error("Failed to insert environmental variable.");
        }
    }
    void addData(const std::vector<environmental_variable_table> &envVars)
    {
        if (!m_mysql.insert(envVars))
        {
            throw std::runtime_error("Failed to insert environmental variables.");
        }
    }
    environmental_variable_table getData(const std::string &key, const std::string &dev_ip)
    {
        auto result = m_mysql.query<environmental_variable_table>("key='" + key + "' AND dev_ip='" + dev_ip + "'");
        if (result.empty())
        {
            throw std::runtime_error("Failed to retrieve environmental variable or variable not found. key=" + key + ", dev_ip=" + dev_ip);
        }
        return result.front();
    }
    void updateData(const std::string &key, const std::string &dev_ip, const environmental_variable_table &updatedEnvVar)
    {
        if (!m_mysql.update(updatedEnvVar, "key='" + key + "' AND dev_ip='" + dev_ip + "'"))
        {
            throw std::runtime_error("Failed to update environmental variable.");
        }
    }
    void removeData(const std::string &key, const std::string &dev_ip)
    {
        if (!m_mysql.execute("delete from environmental_variable_table where key='" + key + "' AND dev_ip='" + dev_ip + "'"))
        {
            throw std::runtime_error("Failed to remove environmental variable.");
        }
    }
};
 
这段的代码实际是对数据库表封装的一个工具模板。
经过调查发现,类似于key这样的内容是一个保留字,在 SQL 中,KEY 是一个保留字,如果你的表中有一个列名叫做 key,你需要使用反引号将其包围起来,以便正确执行查询。
或者直接修改名称。这里我将key 修改为了m_key,解决了问题。
同样的,这里把相关的类似保留字都列出来,防止再出现类似的问题。
 以下是一些常见的 MySQL 保留字及其含义:
| 保留字 | 含义 | 
|---|---|
| ADD | 添加新列或索引到表中 | 
| ALTER | 修改表结构 | 
| AND | 逻辑运算符 AND | 
| AS | 重命名列或表 | 
| BETWEEN | 在某个范围内 | 
| BY | 按照某种方式 | 
| CREATE | 创建数据库或表 | 
| DELETE | 删除记录 | 
| FROM | 从哪个表中检索数据 | 
| GROUP BY | 按照某个列分组 | 
| HAVING | 对 GROUP BY 的结果进行条件过滤 | 
| IN | 在某个值列表中 | 
| INSERT | 插入记录 | 
| INTO | 插入数据的目标表 | 
| IS | 判断是否为某个值 | 
| JOIN | 连接两个或多个表 | 
| KEY | 索引关键字 | 
| LIKE | 模糊匹配 | 
| NOT | 逻辑运算符 NOT | 
| NULL | 空值 | 
| OR | 逻辑运算符 OR | 
| ORDER BY | 按照某个列排序 | 
| SELECT | 查询数据 | 
| SET | 设置变量值 | 
| UPDATE | 更新记录 | 
| VALUES | 插入数据的值列表 | 
| WHERE | 指定条件 | 
分享一个有趣的 学习链接:https://xxetb.xet.tech/s/HY8za









