近日开始对数据库开始涉猎,在编写数据库操作类调试过程中遇到一个问题:
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