如何在不执行MySQL查询的情况下检查它是否有效?

问题描述 投票:0回答:6

我正在制作一个简单的工具,它将获取一串 MySQL 命令并运行它(在多个数据库服务器上顺序运行)。我相信用户是明智的,但错误时有发生,我正在寻找一种方法来防止基本的拼写错误:

有没有办法在运行时验证(相对简单的)MySQL 查询以查看它们在语法上是否正确?

我不是在寻找语义正确性,例如表名或连接适用性;只是类似于 SQL 查询的拼写检查。

换句话说,

SELECT * FROM x;

INSERT INTO x SET id=1,bar="foo";

将被标记为有效,而其中任何一个都不会:

SELECT FROM x;
SECLET * RFOM x;
ISNETR INTO x SET id=1;
HJBGYGCRYTCY;

对于

SELECT
,我可以根据我的需要调整
EXPLAIN
- 运行
EXPLAIN SELECT (...)
并观察错误,但是还有没有办法检查其他命令?

mysql validation
6个回答
20
投票

为了验证查询,我使用 EXPLAIN 命令。您可以接受任何 SQL 查询并在其前面添加 EXPLAIN 并执行。 如果查询错误,将返回错误。

示例:

explain select * from users;
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+
|  1 | SIMPLE      | users | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    1 |   100.00 | NULL  |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+

还有错误的查询

explain select * from users2;
ERROR 1146 (42S02): Table 'test.users2' doesn't exist

附注解释也适用于插入、更新、删除。不仅选择


9
投票

必须了解模式(例如,“x”是表吗?)并编写 SQL 解析器。你的 MySQL 查询工具应该能够进行这种验证(如果你愿意的话,可以进行智能感知),但我从第一手经验中知道,大多数(免费)MySQL 工具都很糟糕。

“准备”查询会执行您想要的操作,但这是运行时检查,而不是编译时检查 - 您似乎正在寻找编译时/离线解决方案。


6
投票

根据您的 MySQL 引擎和设置,您可以启动事务,尝试查询,然后进行回滚。假设脏读关闭,那应该可以工作。


4
投票

您可以创建一个临时表来避免查询的副作用:

CREATE TEMPORARY TABLE users SELECT * FROM users;
INSERT INTO users(name) VALUES('UniqueName');
DROP TABLE users;
SELECT * FROM users WHERE name='UniqueName'; -- Should return 0 results

0
投票

您可以使用您的代码和唯一名称临时创建一个存储过程。 然后你就可以立即放下它。事务无法回滚 SP 创建。 但要小心,因为它只是语法验证,所以它不会检查对象(在您的查询中)是否存在。


0
投票

从员工中删除,其中columnname='salary';

© www.soinside.com 2019 - 2024. All rights reserved.